说起身份证这个东西,可以吐槽的点实在是太多了,曾经开发 X 项目时需要充分利用身份证信息,如籍贯、年龄、性别、生肖和星座等。除籍贯外其它信息都可以自己解析生成,籍贯这个,我们又不可以连到公安局内网查,自然需要求助官方发布的数据。

身份证相关的行政数据目前已由民政部管理,部分已经整理好的数据可参考 cn/GB2260: 中华人民共和国国家标准 GB/T 2260 行政区划代码 mca 目录下保存有原始信息。在使用 cn 下不同语言的实现时,发现引用的数据还是有点滞后,这会造成部分老的行政身份证号无法解析。因此在自己项目中使用时,建议基于这些数据构建自己的数据库。

除了官方整理的数据之外,还有一作者在 自己网站 也整理了一份,并标注有『民政部自己以1984年版为基础向1980年倒推了编码,可惜很多倒推是错误的。本表不使用倒推编码』,想偷懒的可以直接用这个网页的数据。

接下来说说身份证号前六位的变化情况,身份证号前六位即籍贯地行政区划,随着各种撤县改市等拆分合并,较老的行政区划或多或少会有变化,民政局上的数据一般以年为单位进行更新,构建自己的数据库时可以加上这一列。需要注意的是官方数据最新版是不包含那些老的废弃的行政区划的,所以在查询时需要注意数据源是否覆盖完整。如果还是遇到为空的情况,简单粗暴的方法是取前两位省份编码。

P.S. 我在整理民政局的 行政区划数据 时发现 1987 年的数据是有问题的,安徽省竟然是 339007! 大家使用时可以考虑移除这一年的数据。