PostgreSQL数据库中ZipCode的列类型?

Ali*_*and 7 postgresql zipcode sqldatatypes

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

Joh*_*and 18

我非常不同意这里提出的建议.

  1. 接受的答案接受不是数字的东西.
  2. 问题是关于邮政编码,而不是邮政编码.
  3. 如果我们认为这个帖子是错误的并且意味着国际邮政编码,则国际邮政编码中出现的字符不会出现在该列表中,并且许多国际邮政编码和美国国内邮政编码可能超过10个字符
  4. 如果我们真的回答了他们提出的问题,关于邮政编码,那么除了数字之外应该没有任何住宿(可以说是连字符)
  5. 美国邮政编码最长可达11位(13个字符计算两个破折号) - 有一个拉链,一个拉链+4,一个拉链+6(程序员称之为zip + 4 + 2)表示法; 最后一个被摩天大楼,大学等等使用
  6. 美国邮政编码总是非负整数,因此不应存储为文本数据,这会受到非正典表示问题的影响(询问那些完成系统的人,他们发现他们的邮政编码与00203不匹配他们在不断地不必要地解析字符串表示时偶然得到的zip 203
  7. 如果您假装实际上正在跟踪国际邮政编码,则此处的短字符序列限制文本字段甚至不会开始执行此任务.脑海中浮现出"中国"这个词.

我的意见:

  1. 决定您是否实际处理美国邮政编码或国际邮政编码
  2. 如果您正在处理美国邮政编码,请将它们作为无符号整数进行跟踪,并在表示它们的文本时用零填充它们.(如果您需要了解为什么从长远来看这会更简单,请考虑unix时间戳和本地TZ表示.)
  3. 如果您正在处理国际邮政编码,请将它们存储在无限制的unicode字符串中,将它们绑定到它们所代表的国家/地区,并使用检查限制按国家/地区验证.这个问题远比前面的声音困难得多.国际地址是地球上最不标准化的东西.等等,你会发现日本房屋号码是如何运作的,或者为什么英国邮政6码有它的差距.


Dan*_*iel 7

它类似于xxxxx-xxxx,因此varchar(10)建议使用.

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

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

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

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

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

  • 请记住,不同国家的拉链外套看起来不同.如果OP的架构有非美国代码,那么你就不能使用这种模式. (3认同)
  • 不.您定义了一个域,然后您可以使用"zipcode"而不是varchar(10).您基本上定义了一种新的数据类型,它带来了自己的验证. (2认同)