ZIP Code、Postal Code、Postcode、PIN Code:全球邮编术语差异详解

Bob
Bob
ENJAKORUZH

一句话总结: 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 CodeNNNNNNNNNN-NNNN5 或 10纯数字10001, 90210-1234ZIP+4 用连字符
加拿大Postal CodeA1A 1A17(含空格)字母+数字K1A 0B1, V6B 3K9中间空格
英国PostcodeA9 9AAAA9A 9AA6-8(含空格)字母+数字SW1A 1AA, M1 1AE末尾 3 字符前空格
澳大利亚PostcodeNNNN4纯数字2000, 3000
德国Postleitzahl (PLZ)NNNNN5纯数字10115, 80331
日本郵便番号NNN-NNNN8(含连字符)纯数字100-0001第 3 位后连字符
印度PIN CodeNNNNNN6纯数字110001, 400001
法国Code PostalNNNNN5纯数字75001, 13001
巴西CEPNNNNN-NNN9(含连字符)纯数字01001-000第 5 位后连字符
韩国우편번호NNNNN5纯数字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,而非 CHARINT
  • 不使用万能正则——按国家分别匹配
  • 保留前导零(如美国 01001、澳大利亚 0800
  • 测试数据覆盖至少 5 个格式规则不同的国家

常见问题

"ZIP Code"和"Postal Code"是同一个东西吗?

功能上是的——都用于邮件路由。但"ZIP Code"是 USPS 的美国专用商标,"Postal Code"是国际通用术语。在加拿大,"Postal Code"是官方名称。在 UI 中使用错误的术语可能让用户产生困惑。

为什么有些邮编以零开头?

在美国,东北部各州的 ZIP Code 以 0 开头(如马萨诸塞州 Amherst 的 01001)。在澳大利亚,北领地的邮编以 0 开头(如 0800)。如果你把邮编存储为整数类型,这些前导零会被自动去掉,导致编码无效。邮编必须存储为字符串。

同一个邮编能在不同国家存在吗?

能。10001 在美国(纽约)和韩国(首尔)都是合法编码。75001 在法国(巴黎)是有效的,在其他系统中也可能看起来合理。因此,数据库中的邮编必须与国家代码配对。

谁来定义邮编格式?

各国的邮政机构各自定义本国格式。主要参考来源:


本文仅供教育和开发参考。请根据目标国家的最新官方邮政文档验证邮编格式。