2009-05-21 56 views
44

從乍看之下,似乎我有兩個基本選擇在數據庫表中存儲ZIP codes使用整數列來存儲美國郵政編碼到數據庫是一個好主意嗎?

  1. 文本(可能是最常見的),即char(5)varchar(9)支持+4擴展
  2. 數字,即32位整數

如果我們假設沒有國際關注的話,兩者都能滿足數據的要求。過去我們通常只是走文字路線,但我想知道是否有人做相反的事情?剛剛從簡單的比較看起來整數方法有兩個明顯的優勢:

  • 這是由於其性質的手段,自動僅限於NUMERICS(而無需驗證文本樣式可以存儲字母和這樣的不屬於,據我所知,永遠在郵政編碼有效)。這意味着我們可以/將/應該放棄驗證用戶輸入正常,但!
  • 佔用較少的空間,即4個字節(對於9位郵政編碼應該足夠多),而不是5或9個字節。

此外,它似乎不會傷害顯示輸出很多。在數字值上使用ToString()是很簡單的,使用簡單的字符串操作爲+4擴展插入連字符或空格或任何其他字符,並使用字符串格式來恢復前導零。

有沒有什麼會阻止使用int作爲美國郵政編碼的數據類型?

+0

我可以發誓這是一個多次欺騙,但我有麻煩找到他們... – rmeador 2009-05-21 15:29:05

+1

@rmeador:http://stackoverflow.com/questions/310540/best-practices-for-storing-postal-addresses-in-a-database-rdbms 是非常相似,而http:///stackoverflow.com/questions/747802/integer-vs-string-in-database 也涉及到這個話題。 – Shog9 2009-05-21 15:32:05

+1

拍ToString on是一個等待發生的錯誤:如果00001變成郵編,該怎麼辦?然後你不能分辨10001和00001-0001之間。 – Mark 2009-05-21 15:52:32

回答

97

數字郵政編碼是 - 以一種小的方式 - 誤導。

數字應該是數字。郵政編碼不會添加或減少或參與任何數字操作。 12309 - 12345不計算從斯克內克塔迪市區到我附近的距離。

對於郵政編碼,沒有人會感到困惑。但是,對於其他類似數字的字段,可能會造成混淆。

由於郵政編碼不是數字 - 他們只是碰巧用限制字母編碼 - 我建議避免數字字段。 1字節的節省不值多少錢。我認爲的含義是比字節更重要。


編輯

「至於前導零......」是我的觀點。數字沒有前導零。在郵政編碼上存在有意義的前導零是另一個證明,他們不是數字。

21

你打算永遠存儲非美國郵政編碼嗎?加拿大有6個字母和一些字母。我通常只使用10個字符的字段。磁盤空間很便宜,不得不重做你的數據模型。

+0

不是說加拿大是世界上唯一的其他地方,只是以此爲例。 – Tom 2009-05-21 15:12:56

+1

即使您現在只需要美國郵政編碼,英國也會使用阿爾法數字郵政編碼 – ChrisF 2009-05-21 15:14:13

+8

,只要貴公司的營銷/銷售人員意識到他們可以在其他地方賺錢,則需要支持其他人:)現在不需要額外的努力來支持它,但會花費很多時間。 – rmeador 2009-05-21 15:31:10

17

使用驗證字符串。郵政編碼可以從0開始,所以數字不是合適的類型。此外,這適用於國際郵政編碼(例如英國,最多8個字符)。在不太可能的情況下,郵政編碼是一個瓶頸,您可以將其限制爲10個字符,但請首先檢查您的target formats

Here are驗證英國,美國和加拿大的正則表達式。


是的,您可以填充以獲得前導零。但是,理論上你會丟棄可能有助於防止錯誤的信息。如果有人在數據庫中發現1235,是原來的,還是有另一個數字被遺漏?最佳做法說你應該說出你的意思。郵政編碼是代碼,而不是數字。你要去add/subtract/multiply/divide郵政編碼嗎?而從實際角度來看,排除延伸拉鍊更重要。

0

整數很好,但它只適用於美國,這就是爲什麼大多數人不這樣做。通常我只是使用varchar(20)左右。對任何語言環境來說可能都是過分的。

9

通常情況下,您將使用非數字數據類型,如varchar,這將允許使用更多的郵政編碼類型。如果您只設置了5位[XXXXX]或9位[XXXXX-XXXX]郵政編碼,您可以使用char(5)或char(10),但我不會推薦它。 Varchar是最安全和最健全的選擇。

編輯:還應該注意的是,如果您不打算在現場進行數值計算,則不應使用數字數據類型。從您添加或減去它的意義上來說,郵政編碼不是一個數字。它只是一個恰好由數字組成的字符串,所以您應該避免使用數字數據類型。

7

從技術角度看,這裏提出的一些觀點相當簡單。我在每日的基礎上處理地址數據清理 - 特別是清理來自世界各地的地址數據。任何想象力都不是一件微不足道的任務。當涉及到郵政編碼時,可能將存儲爲整數,儘管它可能不是「語義上」正確的。事實是,數據是否是數字形式,嚴格來說,它是被認爲是數值。

但是,將它們存儲爲數字類型的一個非常現實的缺點是,您將失去輕鬆查看數據是否輸入錯誤(即缺少值)的能力,或系統是否刪除導致代價高昂的操作的前導零驗證可能無效的郵政編碼是否正確。

如果其中一個影響是業務延遲,那麼強制用戶輸入正確的數據也非常困難。如果不明顯,用戶通常無法輸入正確的數據。使用正則表達式是保證正確數據的一種方式,但是如果用戶輸入的值不符合要求並且顯示錯誤,則可能完全忽略此值或輸入符合要求的內容,但不正確。一個例子[使用加拿大郵政編碼]是,你經常看到A0A 0A0輸入,這是無效的,但符合加拿大郵政編碼的正則表達式。通常,這是由被迫提供郵政編碼的用戶輸入的,但他們要麼不知道它是什麼,要麼沒有全部正確。

一個建議是驗證整個條目作爲驗證郵政編碼與其餘地址相比是否正確的單元。如果不正確,那麼爲該地址提供備用的有效郵政編碼將使他們更容易輸入有效的數據。同樣,如果郵政編碼對街道地址是正確的,但街道號碼不屬於該郵政編碼的範圍,則爲該郵政編碼/街道組合提供備用街道號碼。

2

除非您有業務要求對郵政編碼數據執行數學計算,否則使用INT沒有意義。你在工程。

希望這有助於

比爾

0

如果你使用了美國拉鍊一個整數,你想10,000乘以領先的部分並添加+4。數據庫中的編碼與輸入驗證無關。您始終可以要求輸入有效或無效,但存儲是您認爲您的要求或USPS會發生變化的問題。 (提示:您的要求更改。)

1

郵政編碼是一個真正的編碼名稱空間,如果你考慮它。傳統的數字,而且還連字符和大寫字母:

「10022-SHOE」

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

實際上,大量的商業應用程序不需要支持這種邊緣情況下,即使它是有效的。

1

沒有,因爲

  • 你從來不知道郵政編碼數學函數
  • 可能包含破折號
  • 可以用有時在標量類型 樣的情況解釋爲零0
  • NULL值開始整數(例如,當您以某種方式導出數據時)
  • 郵政編碼,即使它是一個數字,也是一個區域的名稱, 意義,這是一個名稱,而不是
0

learned recently在Ruby中一個原因,你會希望避免,這是因爲有與領先的零開始有些郵政編碼的任何一個數字量,如果其存儲如在整數 - 將自動轉換爲八進制。

the docs

您可以使用特殊前綴十進制,十六進制,八進制或二進制格式寫號。對於十進制數字使用前綴0d,對於十六進制數字使用前綴0x,對於八進制數字使用前綴0或0o ...

相關問題