8

在数据库中保存ZipCode值的正确列类型是什么?PostgreSQL

4

3 回答 3

22

我强烈不同意这里提出的建议。

  1. 接受的答案接受不是数字的东西。
  2. 问题是关于邮政编码,而不是邮政编码。
  3. 如果我们假设该帖子是错误的并且表示国际邮政编码,则国际邮政编码中出现的字符未出现在该列表中,并且许多国际 - 以及美国国内 - 邮政编码可能超过十个字符
  4. 如果我们真的回答了他们提出的关于邮政编码的问题,那么除了数字(可以说是连字符)之外,不应该有任何其他内容
  5. 美国邮政编码最长可达 11 位(包括两个破折号在内 13 个字符)——有一个 zip、一个 zip+4 和一个 zip+6(程序员称之为 zip+4+2)表示法;最后一个被摩天大楼、大学等使用
  6. 美国邮政编码总是非负整数,因此不应存储为文本数据,这会受到非规范表示问题的影响(询问任何做过系统的人,他们发现他们的邮政编码 00203 不匹配的时间他们在不断不必要地解析字符串表示时意外得到的 zip 203)
  7. 如果您假装您实际上是在跟踪国际邮政编码,那么这里的短字符序列限制文本字段甚至无法开始工作。想到了“中国”这个词。

我的意见:

  1. 确定您实际上是在处理美国邮政编码还是国际邮政编码
  2. 如果您正在处理美国邮政编码,请将它们作为无符号整数进行跟踪,并在表示它们的文本时用零填充它们。(如果您需要了解为什么从长远来看这会更简单,请考虑 unix 时间戳和本地 TZ 表示。)
  3. If you're handling international post codes, store them in an unbounded unicode string, tie them to the country they represent, and validate country by country with check constraints. This problem is far more difficult than it sounds up front. International addresses are some of the least standardized things on Earth. Wait'll you find out how Japanese house numbers work, or why the British postal 6-code has the gaps it has.
于 2014-09-09T23:08:08.733 回答
7

它类似于 xxxx-xxxx,所以varchar(10)推荐。

如果要检查数据库中值的语法,可以domain为邮政编码创建一个类型。

CREATE DOMAIN zipcode varchar(10) 
    CONSTRAINT valid_zipcode 
    CHECK (VALUE ~ '[A-Z0-9-]+'); -- or a better regular expression

你可以看看这个网站,它提出了这个正则表达式:

(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$)

但是您应该检查它是否适用于PostgreSQL正则表达式语法。

于 2011-03-24T14:51:03.793 回答
-1

这取决于你想要什么样的拉链。如果您确定只需要存储标准的 5 位数字,那么使用 int 将是最节省空间的。

但是,如果您需要进行 5+4 扩展,那么最好使用 10 位字符字段。我个人建议,如果您最终需要存储 10 位数的国际邮政编码,它确实会在未来变得更容易,这几乎涵盖了我遇到的所有可能的邮政编码格式。

于 2011-03-24T15:11:00.867 回答