各国邮编格式是地址系统里最容易被想当然对待的一块。邮编看起来只是一串短字符,但它在不同国家使用不同的位数、不同的字符集,有些国家甚至没有邮编制度。读完这篇你至少能避开三类最常见的坑:把邮编当数字存导致前导零消失、以为全世界的邮编都一样长、以及在国家切换时忘记换校验规则。
位数和字符集:不止一种组合
把有邮编制度的国家放在一起看,大致可以分成几类。一类是纯数字且位数固定的,位数通常在四到六位之间。一类是字母数字混合的,加拿大、英国、荷兰、爱尔兰都属于这一支,字母与数字的排列位置各有约定。还有一类按区域码加投递点分段,编号本身带有层级含义,英国的邮编就是典型:前半段定位到一个区域,后半段缩小到一小片投递点。
需要记住的是这些分类只是概览。同一国家内部也可能出现新格式,位数调整或者新增字符集都不是没有发生过的事。所以不要把某国等于某位数当成永久真理,校验规则应当有升级的余地。
全世界的邮编都一样长吗?
不一样,而且差别不小。纯数字国家里,位数常见的区间大致是四位到六位;采用字母数字混合的国家,总长度通常也在这个区间里,但允许出现字母,因此不能只按长度判断。再算上前缀、空格与连字符这类书写元素,同一条邮编在信封上的视觉长度可能比数据里多出几个字符。
这条差异直接影响两件事。一是字段的长度上限要按最长的情况设置,把上限卡得太紧会让合法邮编无法输入。二是校验不能只检查位数,还要检查字符集;只检查位数会放过「把字母位置填成数字」这类错误,而这类错误在混合格式的国家里相当常见,尤其是用户习惯性地打开数字键盘的时候。
哪些国家和地区没有邮编制度?
确实存在没有邮编体系的国家和地区。对于这些地方,地址的定位完全依赖行政区、城市和街道名称,邮编栏在本地表格里根本不存在。问题出在跨国网站上:表单把邮编设成必填,用户就被迫编一个数字,常见的做法是填一串零或者填本国首都的邮编。
这种被迫编造的输入会污染数据。同一批订单里可能混着真实的邮编、占位数字和随手打的数字,后续按邮编做区域分析就没有意义了。更稳妥的处理是让邮编栏在有邮编的国家才出现,在没有邮编的国家改成选填或者干脆隐藏。
前导零为什么总在数据库里消失
这是邮编最经典的一类事故。当邮编被存成整数类型时,开头的零没有数值意义,于是会被直接丢掉,读出来只剩后面的数字。表面上只是少了一位,实际上这个地址已经指到别处去了:邮编的前几位往往决定大区域,丢掉首位等于换了一个区域。
修起来也不轻松。已经丢掉的零无法从数据里恢复,只能重新采集或者用规则猜。因此这条经验值得放在字段设计的最前面:邮编是标识符,不是数字,存储类型应当按字符串处理,与电话号码同理。
用正则表达式能校验邮编吗?
可以,但只能校验形状,不能校验是否存在。正则擅长回答的问题是:这串字符的位数对不对、该出现字母的位置是不是字母、有没有混进空格以外的符号。它回答不了这个邮编是否属于用户填的城市,更回答不了这个投递点是否真实存在。
一个更实际的用法是把正则按国家拆开:选中哪个国家,就换用哪一套规则,而不是用一个万能正则容忍所有格式。万能正则的下场通常是把明显错误的输入也放过,等于没校验。关于校验能做到什么、做不到什么,地址校验与规范化里有更完整的讨论。
国家切换时邮编栏该跟着变什么
邮编栏的必填状态、位数提示、键盘类型都应当跟随所选国家变化。下表列的是切换国家时最容易被漏掉的几件事:
| 变化什么 | 为什么 | 常见后果 |
|---|---|---|
| 必填与选填 | 有的国家没有邮编 | 用户被迫填占位数字 |
| 允许的字符集 | 纯数字与字母数字混合并存 | 合法邮编被拦下 |
| 输入键盘类型 | 纯数字国家不需要切换字母键盘 | 移动端输入变慢 |
| 与其他字段的一致性 | 邮编与行政区、城市存在范围关系 | 录入了互不匹配的数据 |
最后一行是开发和测试都容易忽略的:邮编与城市的匹配关系比邮编本身难验证得多,而在有官方数据的国家里,这恰恰是最值得测的一类错误。
给开发者:邮编字段的几条硬性建议
第一,存储用字符串。这条没有例外,任何把邮编放进整数字段的方案迟早会丢掉前导零。
第二,把邮编的校验规则按国家组织成一张可维护的表,而不是散落在各个表单里。表里至少要有允许的字符集、位数范围、是否必填三项;将来某个国家改格式,只需要改表里的一行。
第三,长度上限放宽一点。有的国家邮编里会出现空格或连字符,用户粘贴时还可能带进不换行空格,字段太紧就会在看不见的地方截断。
第四,准备边界样本:最短和最长位数的邮编、全数字与含字母的邮编、没有邮编国家的空值、以及用户粘贴进来带多余空格的输入。国家与你所在市场的对应关系,可以参考ISO 国家代码与行政区代码;如果你在准备覆盖多个国家的测试集,测试固定装置里的地址数据给了组织方式。这里列出的邮编样本只用于测试,不能投递,也不对应任何真实投递点。
下一步
想直接拿到位数与字符集正确的邮编样本,去随机地址生成器里按国家生成,切换国家时邮编栏的格式会跟着变,也可以对照英国这类字母数字混合格式与纯数字格式的差别。动手改表单之前,先把自己项目里邮编字段的类型和长度上限检查一遍——这一条改动的收益往往比加十条校验规则还大。