乍一看,我似乎有两种基本的存储选择 邮政编码 在数据库表中:

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

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

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

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

有什么会阻止使用 int 作为仅适用于美国的邮政编码的数据类型?

有帮助吗?

解决方案

数字邮政编码在某种程度上具有误导性。

数字应该有意义 数字. 。邮政编码不进行加减或参与任何数字运算。12309 - 12345 不会计算从斯克内克塔迪市中心到我家附近的距离。

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

由于邮政编码不是数字——它们只是碰巧用受限字母进行编码——我建议避免使用数字字段。节省 1 个字节并没有多大价值。我认为那 意义 比字节更重要。


编辑.

“至于前导零......”是我的观点。数字没有前导零。邮政编码中有意义的前导零的存在再次证明它们不是数字。

其他提示

您打算存储非美国邮政编码吗?Canada 由 6 个字符和一些字母组​​成。我通常只使用 10 个字符的字段。磁盘空间很便宜,但必须重新设计数据模型则不然。

使用带有验证的字符串。邮政编码可以以 0 开头,因此数字不是合适的类型。此外,这也完全适用于国际邮政编码(例如英国,最多 8 个字符)。万一邮政编码成为瓶颈,您可以将其限制为 10 个字符,但请检查您的 目标格式 第一的。

这里有 英国、美国和加拿大的验证正则表达式。


是的,您可以通过填充来恢复前导零。但是,从理论上讲,您会丢弃在发生错误时可能有帮助的信息。如果有人在数据库中找到 1235,那原来是 01235,还是漏掉了另一个数字?

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

通常,您会使用非数字数据类型,例如 varchar,它允许更多邮政编码类型。如果您执意只允许 5 位数 [XXXXX] 或 9 位数 [XXXXX-XXXX] 邮政编码,则可以使用 char(5) 或 char(10),但我不建议这样做。Varchar 是最安全、最明智的选择。

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

从技术角度来看,这里提出的一些观点相当微不足道。我从事地址数据清理工作 日常的 基础 - 特别是清理来自世界各地的地址数据。无论怎么想,这都不是一项微不足道的任务。当涉及到邮政编码时,您 可以 将它们存储为整数,尽管它可能在“语义上”不正确。事实上,严格来说,数据是否是数字形式 被视为数字值。

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

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

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

除非您有对邮政编码数据执行数学计算的业务需求,否则使用 INT 是没有意义的。你已经超越工程了。

希望这可以帮助,

账单

没有为什么

  • 你永远不会对邮政编码执行数学函数
  • 可以包含破折号
  • 可以从0开始
  • 在标量类型(例如Integer)的情况下,无效的值有时将其解释为零(例如当您以某种方式导出数据时)
  • 邮政编码,即使是一个数字,也是一个区域的名称,这意味着这是一个名称,而不是数字数量

如果你仔细想想的话,邮政编码实际上是一个编码的命名空间。传统上是数字,但也有连字符和大写字母:

“10022-鞋”

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

实际上,许多业务应用程序不需要支持这种边缘情况,即使它是有效的。

整数很好,但它只适用于美国,这就是为什么大多数人不这样做。通常我只使用 varchar(20) 左右。对于任何语言环境来说可能都太过分了。

如果您要使用美国邮政编码的整数,则需要将前导部分乘以 10,000,然后加上 +4。数据库中的编码与输入验证无关。您始终可以要求输入有效或无效,但存储量取决于您认为您的要求或 USPS 会发生多少变化。(暗示:您的要求 将要 改变。)

最近学到的 在 Ruby 中,您希望避免这种情况的原因之一是因为有些邮政编码以前导零开头,如果以整数形式存储,它们将自动转换为八进制。

文档:

您可以使用特殊前缀以十进制、十六进制、八进制或二进制格式写入数字。对于十进制数使用前缀 0d,对于十六进制数使用前缀 0x,对于八进制数使用前缀 0 或 0o...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top