小型地区与特殊代码是一类很容易被误伤的数据:属地、海外省、特殊管辖区以及与外部有特殊安排的地区,常常同时出现在几套编码体系里,而且未必每一套都有对应值。用一套「所有地区都有两位代码」的假设去写逻辑,第一处翻车通常就发生在这里。
哪些条目会被归进「小型地区」?
这个分类本身不是编码体系里的正式分类,只是为讨论方便而划出来的一组,通常包括:
- 属地与海外省:行政隶属上归某个国家,但地址与投递往往自成一套。
- 特殊管辖区:有自己的编码或邮政安排,但规模很小。
- 与外部有特殊安排的地区:在编码体系里有独立条目,实际使用范围有限。
- 过渡中的条目:正在被替换或停用,暂时还在兼容期内。
把它们放在一起看的原因是:这几类最容易被通用规则漏掉,而它们又都真实存在。哪些条目应该进入你的国家和地区集合,判断标准见如何挑选测试国家。
三套代码体系为什么会并存
国家和地区层面存在不止一套编码:两位字母、三位字母、三位数字,各自面向不同的用途与历史背景。
两位字母适合做键值,短且稳定,是大多数系统里的首选。三位字母在需要更长标识或与某些体系对接时使用。三位数字在缺少字母支持的环境里更常见。
它们之间的关系不是「一种更高级地替代另一种」,而是各有适用面。麻烦的地方在于:
- 三套体系覆盖的条目集合并不完全相同。
- 同一个条目在不同体系里的名称形式可能不一致。
- 有的条目只在其中一套里有值。
跨主题里对这些编码体系的组织方式有更系统的梳理,见国家代码与下级行政区编码。本篇关心的是另一个问题:当某套里没有值时,系统该怎么办。
还有一层现实约束:不同体系对同一个条目的名称写法并不统一,有的用简称,有的用完整描述。做展示与搜索时,不能假定从某一套体系取来的名字可以直接拿去用,否则同一个地区会因为来源不同而在界面上呈现出两种样子。
没有两位代码的地区怎么处理?
先要接受一个事实:并非每个地区都有两位代码。这不是数据缺失,而是编码体系本身的设计结果。
处理方式取决于该条目在你系统里的用途。
如果它需要被投递,那投递相关字段应该跟着实际的邮政安排走,而不是跟着有没有两位代码走。
如果它只需要被展示与选择,那它应当出现在列表里,并用一个明确的标识来区分,而不是借用一个相近的两位代码——借用会在下游制造出一个看似合法、实际错误的值。
如果它只在历史数据里出现,那它需要能被回显和解释,但不必出现在新的选择列表里。
共同的要求是:系统里必须存在一种表达「这一项没有两位代码」的方式,而不是让这个位置留空。留空和「有值但为空」在排查时是完全不同的两件事。
保留码与过渡码该不该出现在列表里?
保留码与过渡码是编码体系里的正常组成部分,问题在于它们和用户可见的列表是两件事。
对用户可见的选择列表来说,保留码通常没有意义,因为它们不对应任何可投递的地区,选到只会制造麻烦。
对系统内部的判定来说,保留码又必须能被识别,至少要能判断出「这个值不是正常条目」,而不是当成一个未知字符串直接报错。
过渡期条目要更小心。它们在一段时间内是合法的,但会逐渐退出。列表里保留它们可以照顾存量数据,代价是新用户也可能选到。可行的做法是:存量继续可用,新选择不再显示,并且在数据上标注它的状态。
判断标准可以简化成一句:用户能不能对它做点什么。不能,就只对它做识别,不把它放进选择。
邮编与行政区在这里的常见差异
小型地区的地址形态往往和它所属的国家不完全一样。
邮编方面,并非每个国家和地区都有邮编,小地区没有邮编的比例更高;即使有,格式也可能与所属国家本土不同。把邮编统一设成必填,或者统一按一种形态校验,都会在这一类条目上直接失败。
行政区方面,层级深度可能更浅,也可能沿用所属国家的划分方式而名称另有习惯。解析时不能假定层级数量固定。
电话区号与货币也可能与所属国家不一致,这一点在跨境单据上最容易暴露,见跨境地址场景。
还有一个常被忽略的点:同一个地区在不同体系下的名称写法可能不同,做搜索别名时要一并纳入,否则用户按习惯写法输入会搜不到。
给开发者:把特殊条目当成一等公民
最省事的实现方式,是把特殊条目当成一等公民,而不是在主流程之外挂一堆例外。
第一,标识要独立。每个条目都要有稳定的内部标识,不依赖任何一套外部编码作为唯一主键,外部编码作为属性存在。
第二,状态要显式。正常、过渡、停用各自有明确取值,而不是靠某几个字段为空来推断。
第三,规则要按状态分支,而不是按条目名单分支。写一堆「如果是某个地区就跳过校验」的名单,会在下一次变更时全部失效。
第四,展示与判定分离。列表里不显示的条目,判定逻辑里仍要认得出,否则历史数据一读就报错。
按这四条做,特殊条目就不再需要在每次新增时专门开会讨论,国家和地区总览页按地区浏览时也不会出现难以归类的空白项。
下一步
先把现有列表里所有「没有两位代码」「只在部分体系里出现」「正在过渡」的条目找出来,给它们各自的内部标识与状态。再检查一遍校验逻辑里有没有按条目名单写死的例外。
做完这一步,通用规则才能真的通用,例外也不必再靠某个人记住。
还要留一句提醒:随着编码体系更新,这类条目的成员会变。今天处在过渡期的条目,明天可能已经停用;今天看起来特殊的条目,也可能因为体系调整而变成普通条目。所以这份清单需要定期重看,而不是一次定完就放着。
文中提到的地区类型与编码情形都是为说明边界情况而构造的合成样本,不指向任何具体国家和地区的实际编码归属,也不构成对任何编码体系适用范围的判断。