一句话总结: ZIP Code 是美国专用,Postal Code 是加拿大的说法,Postcode 用于英国和澳大利亚,PIN Code 是印度的术语。它们的功能一样——将邮件路由到正确的目的地——但格式、字符集、长度和分隔符规则各不相同。如果你在做国际化地址表单,把它们统统塞进一个"zip code"字段,是 bug 的常见来源。
各术语的含义
ZIP Code(美国)
ZIP 是 Zone Improvement Plan 的缩写,1963 年由 USPS 推出。标准格式为 5 位数字(如 90210),扩展格式 ZIP+4 在后面加一个连字符和 4 位数字(如 90210-1234),可以精确到具体街区或建筑。
Postal Code(加拿大)
加拿大使用 6 个字符的字母数字混合格式,模式为 A1A 1A1——字母和数字交替排列,中间有一个空格。前三个字符(Forward Sortation Area)标识地理区域,后三个字符(Local Delivery Unit)缩小到具体的地址或投递组。字母 D、F、I、O、Q、U 不会出现,以避免与数字混淆。
Postcode(英国)
英国邮编格式更复杂:1-2 个字母 + 1-2 个数字 + 可选字母 + 空格 + 1 个数字 + 2 个字母。例如 SW1A 1AA(白金汉宫)和 EC2R 8AH。空格前的部分(outward code)标识区域和地区,空格后的部分(inward code)标识投递扇区和投递点。
PIN Code(印度)
PIN 是 Postal Index Number 的缩写,6 位纯数字(如 110001)。第 1 位代表区域,第 2 位代表子区域,第 3 位代表分拣区,后 3 位代表具体邮局。
国家对比表
| 国家 | 术语 | 格式 | 长度 | 字符类型 | 示例 | 分隔符 |
|---|---|---|---|---|---|---|
| 美国 | ZIP Code | NNNNN 或 NNNNN-NNNN | 5 或 10 | 纯数字 | 10001, 90210-1234 | ZIP+4 用连字符 |
| 加拿大 | Postal Code | A1A 1A1 | 7(含空格) | 字母+数字 | K1A 0B1, V6B 3K9 | 中间空格 |
| 英国 | Postcode | A9 9AA 到 AA9A 9AA | 6-8(含空格) | 字母+数字 | SW1A 1AA, M1 1AE | 末尾 3 字符前空格 |
| 澳大利亚 | Postcode | NNNN | 4 | 纯数字 | 2000, 3000 | 无 |
| 德国 | Postleitzahl (PLZ) | NNNNN | 5 | 纯数字 | 10115, 80331 | 无 |
| 日本 | 郵便番号 | NNN-NNNN | 8(含连字符) | 纯数字 | 100-0001 | 第 3 位后连字符 |
| 印度 | PIN Code | NNNNNN | 6 | 纯数字 | 110001, 400001 | 无 |
| 法国 | Code Postal | NNNNN | 5 | 纯数字 | 75001, 13001 | 无 |
| 巴西 | CEP | NNNNN-NNN | 9(含连字符) | 纯数字 | 01001-000 | 第 5 位后连字符 |
| 韩国 | 우편번호 | NNNNN | 5 | 纯数字 | 03171, 06164 | 无 |
这些差异对开发者意味着什么
如果你的应用面向多国用户,一个 zip_code VARCHAR(5) 字段或者纯数字正则就能让大部分国家的地址直接报错。以下是最常见的坑。
错误 1:强制纯数字输入
加拿大邮编(V6B 3K9)、英国邮编(SW1A 1AA)以及其他多个国家都使用字母。纯数字验证规则会直接拒绝这些国家的合法地址。
错误 2:去掉空格
英国邮编和加拿大邮编中的空格是有意义的。根据 Royal Mail 寄址指南,SW1A1AA 去掉空格后在技术上是不标准的。虽然邮件可能仍然能送达,但数据会无法通过严格验证,而且对这些国家的用户来说看起来就是不对劲。
错误 3:强制固定长度
邮编长度从 3 个字符(冰岛:101)到 10 个字符(美国 ZIP+4:90210-1234)不等。硬编码长度检查会拒绝超出你初始假设的国家的有效编码。
错误 4:使用单一万能正则
不存在一个能正确验证所有国家邮编的万能正则。适用于美国 ZIP 的正则(^\d{5}(-\d{4})?$)会把加拿大、英国、日本、巴西的邮编全部判定为无效。按国家分别验证是唯一可靠的方案。
错误 5:给所有国家的用户都显示"ZIP Code"
在面向加拿大或英国用户的表单上标注"ZIP Code"会造成困惑。用户可能不认识这个词,或者以为这个表单只面向美国。使用"Postal Code"或"Postcode"作为中性标签,或者根据所选国家动态切换标签文案。
数据库存储建议
不要 把所有国家都塞进一个 zip_code CHAR(5) 字段。以下是实用建议:
推荐 schema:
postal_code VARCHAR(20) -- 兼容所有已知格式
country_code CHAR(2) -- ISO 3166-1 alpha-2
索引:(country_code, postal_code)
核心原则:
- 存储用户输入的 原始格式,包括空格和连字符
- 只在查询逻辑中做标准化(去除空格/连字符),不要在存储时改动
- 使用
VARCHAR而非CHAR——尾部补位会导致比较逻辑出错 - 字段长度留足余量(
VARCHAR(20)),应对边界情况和未来格式变化 - 邮编必须搭配
country_code——同一个字符串(如10001)在多个国家都可能是合法编码
按国家的验证策略
正确做法是按国家分别验证。以下是常见格式的正则参考表:
| 国家 | 正则表达式 | 说明 |
|---|---|---|
| 美国 | ^\d{5}(-\d{4})?$ | ZIP+4 可选 |
| 加拿大 | ^[A-Za-z]\d[A-Za-z]\s?\d[A-Za-z]\d$ | 空格可选 |
| 英国 | ^[A-Z]{1,2}\d[A-Z\d]?\s?\d[A-Z]{2}$ | 格式复杂,建议用库 |
| 德国 | ^\d{5}$ | 固定 5 位 |
| 日本 | ^\d{3}-?\d{4}$ | 连字符可选 |
| 印度 | ^\d{6}$ | 固定 6 位 |
| 澳大利亚 | ^\d{4}$ | 固定 4 位 |
| 巴西 | ^\d{5}-?\d{3}$ | 连字符可选 |
| 法国 | ^\d{5}$ | 固定 5 位 |
| 韩国 | ^\d{5}$ | 固定 5 位(2015 年起) |
注意: 正则只验证 格式,不验证 真实存在性。00000 能通过美国正则,但它不是一个真实的 ZIP Code。存在性验证需要邮政数据库查询或验证 API。
如何测试多国邮编处理
构建国际地址支持需要每个目标国家的测试数据。与其手动研究各国格式,不如用 AddressGen 直接生成格式正确的样例地址:
如果想深入了解加拿大的邮编体系,可以参考我们的 加拿大邮编系统介绍。
按国家生成地址,可以构建覆盖以下维度的测试矩阵:
- 所有字符类型(纯数字、纯字母、混合)
- 所有分隔符类型(空格、连字符、无分隔符)
- 最短和最长长度
- 边界情况(前导零、字母数字交替)
开发者实现清单
构建或审计国际地址表单时,可以逐项对照:
- 邮编字段接受字母、数字、空格和连字符
- 字段长度至少允许 10 个字符
- 验证规则随选定国家动态切换
- 字段标签随国家适配(ZIP Code / Postal Code / Postcode / PIN Code)
- 存储时保留空格和连字符
- 数据库列类型为
VARCHAR,而非CHAR或INT - 不使用万能正则——按国家分别匹配
- 保留前导零(如美国
01001、澳大利亚0800) - 测试数据覆盖至少 5 个格式规则不同的国家
常见问题
"ZIP Code"和"Postal Code"是同一个东西吗?
功能上是的——都用于邮件路由。但"ZIP Code"是 USPS 的美国专用商标,"Postal Code"是国际通用术语。在加拿大,"Postal Code"是官方名称。在 UI 中使用错误的术语可能让用户产生困惑。
为什么有些邮编以零开头?
在美国,东北部各州的 ZIP Code 以 0 开头(如马萨诸塞州 Amherst 的 01001)。在澳大利亚,北领地的邮编以 0 开头(如 0800)。如果你把邮编存储为整数类型,这些前导零会被自动去掉,导致编码无效。邮编必须存储为字符串。
同一个邮编能在不同国家存在吗?
能。10001 在美国(纽约)和韩国(首尔)都是合法编码。75001 在法国(巴黎)是有效的,在其他系统中也可能看起来合理。因此,数据库中的邮编必须与国家代码配对。
谁来定义邮编格式?
各国的邮政机构各自定义本国格式。主要参考来源:
- 美国: USPS Publication 28
- 加拿大: Canada Post 寄址指南
- 英国: Royal Mail Postcode Finder
- 印度: India Post PIN Code Directory
- 国际: 万国邮政联盟(UPU) 维护跨国标准
本文仅供教育和开发参考。请根据目标国家的最新官方邮政文档验证邮编格式。
