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

从乍一看,它会出现我有两个基本的select存储邮政编码在数据库表中:

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

如果我们假设没有国际关注的话,两者都能满足数据的要求。 过去我们通常只是走文字路线,但我想知道是否有人做相反的事情? 仅仅从简单的比较看来,整数方法有两个明显的优点:

  • 就其本质而言,它只能自动地限于数字(而没有validation,文本样式可以存储字母,而且据我所知,这些字母在邮政编码中是无效的)。 这并不意味着我们可以/将/应该放弃validation用户input正常,但!
  • 占用4个字节(即使是9位邮政编码也应该足够多),而不是5或9个字节。

另外,它似乎不会伤害显示输出很多。 在数字值上打一个ToString()是很简单的,使用简单的string操作为+4扩展插入一个连字符或空格,或者使用string格式来恢复前导零。

有没有什么会阻止使用int作为美国邮政编码的数据types?

一个数字邮政编码是 – 一个小的方式 – 误导。

数字应该是数字的意思。 邮政编码不添加或减less或参与任何数字操作。 12309 – 12345不计算从斯克内克塔迪市区到我附近的距离。

诚然,对于邮政编码,没有人会感到困惑。 但是,对于其他类似数字的字段,可能会造成混淆。

由于邮政编码不是数字 – 他们只是碰巧用限制字母编码 – 我build议避免数字字段。 1字节的保存是不值钱的。 我认为这个意思比字节更重要。


编辑

“至于领先零……”是我的观点。 数字没有前导零。 在邮政编码上存在有意义的前导零是另一个certificate,他们不是数字。

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

使用具有validation的string。 邮政编码可以从0开始,所以数字不是一个合适的types。 此外,这适用于国际邮政编码(如英国,最多8个字符)。 在不太可能的情况下,邮政编码是一个瓶颈,你可以限制为10个字符,但首先检查你的目标格式 。

这里是英国,美国和加拿大的validation正则expression式。


是的,你可以填补前面的零。 但是,理论上你会丢弃可能有助于防止错误的信息。 如果有人在数据库中发现1235,是原来的01235,还是丢失了另一个数字?

最佳实践说,你应该说你的意思。 邮政编码是一个代码,而不是一个数字。 你打算加/减/乘/除邮政编码? 而从实际的angular度来看,排除扩展的拉链更为重要。

通常情况下,您可以使用非数字数据types,例如varchar,这将允许使用更多的邮政编码types。 如果您只设置了5位[XXXXX]或9位[XXXXX-XXXX]的邮政编码,您可以使用char(5)或char(10),但我不会推荐它。 Varchar是最安全和最健全的select。

编辑:还应该注意的是,如果你不打算在现场进行数值计算,你不应该使用数字数据types。 邮政编码是一个不是一个数字的意义上,你添加或减去它。 这只是一个恰好由数字组成的string,所以您应该避免使用数字数据types。

从技术angular度来看,这里提出的一些观点相当微不足道。 我每天都在处理地址数据清理工作 – 特别是清理来自世界各地的地址数据。 想象力的延伸并不是一件微不足道的事情。 当涉及到邮政编码时,您可以将它们存储为整数,尽pipe它可能不是“语义上”正确的。 事实是,数据是否是一个数字forms,严格地说,它认为是数字的价值。

然而,把它们作为数字types存储的一个非常现实的缺点是,你将失去很容易看到数据是否被错误地input(即缺less值)的能力,或者如果系统移除了导致代价高昂操作的前导零来validation潜在的无效邮政编码,否则是正确的。

如果其中一个影响是业务延迟,那么强制用户input正确的数据也是非常困难的。 用户通常没有足够的耐心来input正确的数据,如果不是很明显的话。 使用正则expression式是保证正确数据的一种方法,但是如果用户input的值不符合要求,并且显示错误,则可能完全忽略该值,或者input符合要求的内容,但不正确。 一个例子(使用加拿大邮政编码)是,你经常看到A0A 0A0input是无效的,但符合加拿大邮政编码的正则expression式。 多数情况下,这是由被迫提供邮政编码的用户input的,但是他们要么不知道是什么,要么没有全部正确。

一个build议是validation整个条目作为一个单位validation邮政编码是正确的,当与其他地址比较。 如果不正确,那么为地址提供备用的有效的邮政编码将使他们更容易input有效的数据。 同样,如果邮政编码对于街道地址是正确的,但街道号码不属于该邮政编码的范围,则为该邮政编码/街道组合提供备用街道号码。

除非您有业务要求对邮政编码数据执行math计算,否则使用INT是没有意义的。 你在工程上

希望这可以帮助,

法案

邮政编码是一个真正的编码名称空间,如果你考虑一下。 传统的数字,也是一个连字符和大写字母:

“10022-SHOE”

http://www.saksfifthavenue.com/main/10022-shoe.jsp

实际上,很多业务应用程序不需要支持这个边界案例,即使它是有效的。

没有为什么

  • 你从来没有在邮编上做math函数
  • 可能包含破折号
  • 可以从0开始
  • 在像整数这样的标量types的情况下,NULL值有时会被解释为零(例如,当您以某种方式导出数据时)
  • 邮政编码,即使它是一个数字,是一个区域的名称,这意味着这是一个名称,而不是任何数量的数量

整数是好的,但它只适用于美国,这就是为什么大多数人不这样做。 通常我只是使用varchar(20)左右。 可能是任何地区的矫枉过正。

如果你使用美国拉链的整数,你会希望乘以10000的前导部分,并添加+4。 数据库中的编码与inputvalidation无关。 您可以随时要求input有效或无效,但存储是您认为您的要求或USPS将发生变化的问题。 (提示:你的要求改变。)