2011-03-24 154 views

回答

7

它類似於xxxxx-xxxx,所以推薦使用varchar(10)

如果要檢查數據庫中值的語法,可以爲郵政編碼創建domain類型。

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

你可以看看this網站,其中提出這個表達式:

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

但是,你應該檢查它的工作原理爲PostgreSQL正則表達式的語法。

+3

請記住,不同國家的zip coes看起來不一樣。如果那裏的OP架構有非美國代碼,比你不能使用這樣的模式。 – DrColossos 2011-03-24 15:16:02

+0

我是PostgreSQL中的n00b,CREATE DOMAIN與CREATE TABLE相同, – 2011-03-24 15:35:56

+2

不。您可以定義一個域,之後您可以使用「zipcode」而不是varchar(10)。你基本上定義了一個新的數據類型,它帶來了自己的驗證。 – Daniel 2011-03-24 16:59:41

0

它取決於你想要什麼類型的zip。如果你確定只需要存儲標準的5位數字,那麼使用int將是最節省空間的。

但是,如果您需要做5 + 4擴展,那麼10位數的字符字段是最好的。我個人認爲,如果您最終需要存儲國際郵政編碼,它確實使它更容易,10位數字涵蓋了我遇到的每種可能的郵政編碼格式。

+1

郵政編碼可以具有前導零,因此對於郵政編碼使用「int」是一個壞主意。郵政編碼不是數字,它們是恰好由數字組成的字符串(有時是連字符)。 – 2011-03-24 17:16:31

+1

int(5)用* ZEROFILL *屬性使5變成00005。 – 2011-07-21 04:18:18

10

我強烈反對這裏提出的建議。

  1. 接受的答案接受的東西不是數字。
  2. 問題是關於郵政編碼,而不是郵政編碼。
  3. 如果我們假設後是錯誤的,是指國際郵政編碼,還有出現在國際郵政代碼字符不會出現在該列表中,與衆多國際 - 也是美國國內 - 郵政代碼可以是十人物
  4. 如果我們真正回答他們提出的問題,關於郵政編碼,那麼就應該有任何東西,但數字沒有住宿(可以說是連字符)
  5. 美國郵政編碼可長達11個位數(13個字符計算兩個破折號) - 有一個zip,一個zip + 4和一個zip + 6(程序員稱爲zip + 4 + 2)符號;最後使用的摩天大樓,大學,等等
  6. 美國郵政編碼總是非負整數,因此不應該被存儲爲文本數據,這是受非佳能表示問題(問任何人誰是做了系統大約在那個時候,他們發現,他們的拉鍊00203不匹配的zip 203時不斷不必要解析字符串表示)
  7. 如果你假裝你實際上跟蹤國際的POST代碼,短的字符序列限制的文本字段,他們意外地得到了這裏甚至不開始做這項工作。想到「中國」這個詞。

我的opinon:

  1. 決定是否實際上是處理美國郵遞區號或國際
  2. 如果你正在處理美國郵遞區號,跟蹤他們爲無符號整數,和當代表它們的文本時,用零填充它們。 (想想unix時間戳和本地TZ表示,如果您需要了解爲什麼這將在更長的時間內更簡單。)
  3. 如果您要處理國際郵政編碼,請將它們存儲在無限制的Unicode字符串中,然後將它們綁定到國家/地區代表並驗證具有檢查限制的國家/地區。這個問題比聽起來要困難得多。國際地址是地球上一些最不標準化的東西。等一下,你會發現日本的房屋號碼是如何工作的,或者爲什麼英國的郵政6代碼有它的差距。
相關問題