使用整数列将美国邮政编码存储在数据库中是一个好主意吗?

Sea*_*ley 51 database database-design types postal-code street-address

乍一看,我认为在数据库表中存储邮政编码有两个基本选择:

  1. 文本(可能是最常见的),即char(5)varchar(9)支持+4扩展
  2. 数字,即32位整数

如果我们假设没有国际问题,两者都将满足数据的要求.在过去,我们通常只是走了文本路线,但我想知道是否有人做相反的事情?只是简单的比较看起来整数方法有两个明显的优点:

  • 通过它的性质,它仅仅自动限于数字(而没有验证,文本样式可以存储字母,据我所知,这些字母在邮政编码中无效).这并不意味着我们可以/将/应该放弃正常验证用户输入!
  • 它占用的空间更少,为4个字节(即使对于9位邮政编码也应该足够),而不是5或9个字节.

而且,它似乎不会对显示输出造成太大影响.打一个ToString()数值,使用简单的字符串操作来插入连字符或空格或其他任何+4扩展名都是微不足道的,并使用字符串格式来恢复前导零.

是否有什么可以阻止使用int仅限美国邮政编码的数据类型?

S.L*_*ott 118

数字邮政编码 - 以较小的方式 - 具有误导性.

数字应该意味着数字.邮政编码不会添加或减少或参与任何数字操作.12309 - 12345不计算从斯克内克塔迪市中心到我家附近的距离.

当然,对于邮政编码,没有人感到困惑.但是,对于其他类似数字的字段,它可能会令人困惑.

由于邮政编码不是数字 - 它们恰好用限制字母编码 - 我建议避免使用数字字段.1字节的保存不值得.我认为这个意义比字节更重要.


编辑.

"至于领先零......"是我的观点.数字没有前导零.邮政编码上存在有意义的前导零是另一个证明它们不是数字的证据.

  • 不幸的是(这是不幸的吗?)你做了一个非常好的语义点.;) (6认同)
  • @Yadyn:我认为这不是因为他发了一个非常好的观点!:) (5认同)
  • 我喜欢这种想法;-) (2认同)
  • 如果你确实使用 .uk 或 .nl 将你的应用程序国际化,你的应用程序是字母数字的,你就会被咬屁股...... (2认同)
  • 好吧,实际上,您可能想要对邮政编码进行数字运算,例如选择 0..90210 范围内的所有邮政编码。(例如,可以将一个国家分为不同的用户群体)。将邮政编码作为字符串可能会给您带来一些问题(事实证明,在标准 SQL 中将字符串转换为整数并不像您想象的那么简单),并且将整数输入范围比较(如 BETWEEN 语句)只会默默地失败...我并不是说你不应该使用字符串,只是可能存在一些例外。 (2认同)

Tom*_*Tom 24

你打算存储非美国邮政编码吗?加拿大有6个字符,有些字母.我通常只使用10个字符的字段.磁盘空间很便宜,不得不重做你的数据模型.

  • 即使您现在只需要美国邮政编码,只要贵公司的营销/销售意识到他们可以在其他地方赚钱,您就需要支持其他人:)现在支持它不需要额外的努力,但是需要很久以后 (8认同)

Mar*_*ark 17

使用带验证的字符串.邮政编码可以从0开始,因此数字不是合适的类型.此外,这适用于国际邮政编码(例如英国,最多8个字符).在不太可能的情况下,邮政编码是瓶颈,您可以将其限制为10个字符,但首先检查您的目标格式.

以下是英国,美国和加拿大的验证正则表达式.


是的,你可以填充以获得领先的零.但是,理论上你丢弃了可能有助于发生错误的信息.如果有人在数据库中找到1235,原来是01235,还是错过了另一个数字?

最佳实践说你应该说出你的意思.邮政编码是代码,而不是数字.你要加/减/乘/分邮政编码吗?从实际角度来看,排除延长拉链更为重要.

  • 我用地址工作*很多*,特别是地址清理.关于删除前导零的观点在实际上远比关于它是否是数字的语义更为重要.在数据清理方面,需要知道数据是否输入错误或者是否缺少前导零,这比您可能想象的要耗费时间. (6认同)

The*_*TXI 9

通常,您将使用非数值数据类型,例如varchar,这将允许更多的邮政编码类型.如果你只是允许5位[XXXXX]或9位[XXXXX-XXXX]邮政编码,你可以使用char(5)或char(10),但我不推荐它.Varchar是最安全,最理智的选择.

编辑:还应注意,如果您不打算对该字段进行数值计算,则不应使用数值数据类型.在您添加或减少邮政编码的意义上,邮政编码不是一个数字.它只是一个恰好由数字组成的字符串,因此您应该避免使用数字数据类型.


Ben*_*ter 7

从技术角度来看,这里提出的一些观点相当微不足道.我每天都在处理地址数据清理- 特别是来自世界各地的清理地址数据.任何想象力都不是一项微不足道的任务.对于邮政编码,您可以将它们存储为整数,尽管它可能不是"语义上"正确的.事实上,数据是否为数字形式,严格来说,它认为是数值的.

但是,将它们存储为数字类型的真正缺点是,您将无法轻松查看数据是否输入错误(即缺少值),或者系统是否删除了前导零,从而导致代价高昂的操作以验证可能无效邮政编码,否则是正确的.

如果其中一个影响是业务延迟,那么强制用户输入正确的数据也很困难.如果用户不是很明显,那么用户通常没有耐心输入正确的数据.使用正则表达式是保证正确数据的一种方法,但是如果用户输入的值不符合并且显示错误,则可能只是完全省略该值或输入符合但不正确的值.[使用加拿大邮政编码]的一个例子是您经常看到输入的A0A 0A0无效但符合加拿大邮政编码的正则表达式.通常情况下,这是由被迫提供邮政编码的用户输入的,但他们要么不知道它是什么,要么没有全部正确.

一个建议是验证整个条目作为一个单元,验证邮政编码与地址的其余部分相比是否正确.如果不正确,则为地址提供备用有效邮政编码将使他们更容易输入有效数据.同样,如果邮政编码对于街道地址是正确的,但街道号码不属于该邮政编码的域名,则为该邮政编码/街道组合提供备用街道号码.


小智 5

没有为什么

  • 你永远不会在邮政编码上做数学函数
  • 可以包含破折号
  • 可以从 0 开始
  • 在标量类型(例如,以某种方式导出数据时)的情况下,NULL 值有时会解释为零
  • 邮政编码,即使它是一个数字,也是一个地区的名称,这意味着这是一个名称而不是任何数字的数量