ISO 国家代码是那种平时不出问题、一出问题就很难查的东西:数据库里存着一批两字母码,对面接口要的却是三位数字码,两边都没报错,只是匹配不上。这篇把国家代码的三种写法、它们各自适合什么场合、以及国家以下的行政区代码该怎么对待讲清楚,读完你能定下自己项目统一用哪一种码,也知道遇到陌生代码时该去哪里确认,而不是自己发明一套。
同一套国家的三种写法
国家代码的第一组是两字母码,格式最短,在数据交换里用得最多:填写表格、拼接接口参数、做键值存储时都常见。第二组是三字母码,比两字母多一个字符,可读性稍好,在需要更不容易看错或者与两字母码区分开的场合使用。第三组是三位数字码,它最大的好处是语言无关,并且对书写错误不如字母那么敏感。
三者描述的是同一批国家与地区,只是写法不同。所以它们之间可以互相转换,前提是有一张可靠的对照表。麻烦恰恰出在这里:如果系统的不同部分各自用了不同的一种写法,而中间没有统一的转换点,就会出现同一个国家在库里有两份档案这种问题。
哪种代码该存进数据库
常见做法是只选一种作为内部存储格式,其他写法在边界处转换。两字母码因为短,被选中的时候最多;选三字母码的理由通常是内部还要和别的地方对照,希望少出现缩写歧义。
比选哪一种更重要的是只选一种。混合存储的代价会在第一次做跨表关联时显现:两份数据看起来都是国家字段,但一份是两字母一份是三字母,关联不上,而错误信息只会告诉你结果为空。如果确实需要保留多种写法,那就把其中一种标记为权威,其他只作为展示或对外的派生值。
国家以下的行政区代码是同一回事吗?
不是,而且这两者经常被混为一谈。国家以下的行政区有自己的编码体系,形式上通常是国家代码加一段本地代码,用连字符连接;它覆盖的层级比国家低一级,例如美国的各个州、日本的都道府县、德国的联邦州都各有一个这样的代码。
它与各国自己使用的行政区编码不是同一件事。统计部门、邮政系统和税务系统往往各有一套本地编码,编码的长度、含义、甚至划分边界都可能和国家标准不一致。做地址数据时如果把它们当成同一个字段,就会出现地区归错、报表对不上这类问题。行政区代码的层级差异还给表单设计带来直接影响,这部分见国际地址格式。
可以自己发明一套代码吗?
不要。短期看自造代码很省事:两位数编号按字母顺序排下去,简单好记。长期看它会成为一处无法与外部对齐的孤岛——对接方给的代码你没有,你给的代码别人不认识,每次交换数据都要手工维护一张映射表,而这张表没有人负责更新。
如果确实需要内部标识,做法是保留一套内部主键,同时把标准代码作为属性存好。这样内部关联用主键,对外交换用标准码,两边互不干扰。过时或者未知的代码也要有兜底策略:不要直接丢弃,而是保留原值并标记为未知,方便后续追查。
代码对不上时该怎么排查
对不上通常有几种固定原因,排查顺序可以照下面这张表来:
| 现象 | 可能原因 | 检查方法 |
|---|---|---|
| 关联结果为空 | 两边写法不同 | 比对字段长度与字符集 |
| 同一个国家出现两条记录 | 混用了两种写法 | 查同一国家的多种写法 |
| 出现不认识的代码 | 用到了过时或本地代码 | 对照标准列表确认 |
| 行政区归错上级 | 用了本地行政编码 | 换用标准行政区代码 |
排查时优先看字段长度,这一步能立刻区分两字母、三字母和数字码三种情况,比逐条核对省时间。
还有一类排查常被跳过:同一个国家因为名称写法不同被拆成两条记录,例如带不带冠词、用简称还是全称。这类问题在字段长度上完全看不出来,需要用国家代码去反查名称,而不是拿名称去匹配代码。反过来做,就会一直在名称的写法上绕圈。
校验国家与行政区时该信到什么程度
国家代码本身是可以严格校验的,因为标准列表是公开、有限、明确的一份清单。行政区代码也能校验,但要注意列表会随行政区划调整而变化,过于严格的校验会把历史数据判成非法。
这两条的差别决定了一个实用策略:国家代码做严格校验并在录入时就拒绝未知值;行政区代码做提示性校验,发现不在列表里时给出警告,但允许保存。把两者用同一套严格程度处理,结果往往是历史地址改不动。相关的思路在地址校验与规范化里展开。
给开发者:存码、取数和兜底
第一,内部统一用一种代码,入口和出口各设一个转换点,不要在业务代码里到处临时转换。
第二,下拉框的数据源要来自标准列表本身,不要在页面里手写一份。手写的列表会随时间过时,而且改动分散在很多地方,很难保证一致。
第三,对于没有选择国家的输入,允许空值而不是默认填第一个国家。默认值看起来方便,实际会往数据里写入大量错误的国别信息。
第四,准备这些边界样本:两字母与三字母写法混入的样本、出现过时或未知代码的样本、行政区层级不同的国家样本、以及完全没有行政区的地区样本。想对照具体国家的行政区与地址层级,德国与日本这类联邦制与两级划分的国家差异比较直观。这些行政区名称与代码样本只用于测试,不能投递,也不要拿去核对真实名册。
下一步
先花十分钟确认自己项目里国家字段存的是哪一种写法,再检查还有哪些地方直接用了另一种写法而没有转换。这项工作没有技术难度,但它能消掉一整类难以定位的关联失败。需要一批字段自洽的多国地址数据,直接用随机地址生成器按国家生成即可。