2011-01-18 42 views
1

我正在存儲電話國家/地區代碼。它們的範圍從1到大約300.對於數據類型,int或string是什麼會更好?我正在使用SQL Server 2008和linq-to-sql。數據庫數據類型性能:int或字符串

謝謝。

+0

您是否在關注前導零(請參閱HLGEM的評論)? –

回答

2

如果你真的擔心空間和性能,那麼你可以使用smallint(相當於int16)。這將意味着數據只會佔用2個字節的存儲空間(在內存中佔2個字節)。

+0

是的,它看起來像國家代碼smallint可能是最好的。請注意,實際的電話號碼當然是以字符串形式存儲的。所以我有兩個字段:國家代碼smallint和電話字符串。 – frenchie

+0

不,它看起來像你試圖在一個10歲的手機上運行字典。過去10年來,任何像樣的數據庫在過去10年都不會在300排長桌上產生可測量的差異。 – TomTom

+0

他並不是說有300行,他說的字段範圍從1到300的有效值。他可能有數百萬行。 –

3

注意:哇,真的很奇怪 - 你問了關於電話代碼,我寫了關於郵政編碼。對於那個很抱歉!我想建議仍然有效,但...


原來的答覆:性能將很可能是微不足道的 - 分配基於數據是什麼正確的類型。郵政編碼,而數字(至少在美國),不是數字 - 它們應該存儲爲字符串。

瞭解您正在存儲的數據的性質是非常重要的。一旦你明白了什麼是什麼,那麼你就可以開始推斷它應該如何存儲。我假設你目前只存儲美國郵政編碼的前5個數字(如:12345)。

如果您要將這些數據存儲爲一個數字,這將起作用。然後想象一下,您的經理告訴您,您正在構建的應用程序會有一項新要求,即開始收集ZIP+4 format中的郵政編碼(看起來像這樣:12345-6789)。現在你陷入了一個討厭的重構,其中包括將數據庫中的類型更改爲varchar(10),或者在應用程序中執行一些瘋狂的巫術來在保存郵政編碼時去掉短劃線,然後將其添加回以供稍後顯示。

+1

甚至電話號碼有時可以是字符串 - 例如1-800-GIZAJOB –

+0

同意。恕我直言,如果它不會像數字那樣被對待,就像對它進行算術運算(例如加法)一樣,並且它不會被數字比較(例如200 <1000),那麼它應該被存儲爲一個字符串。電話號碼是一系列的數字字符,不應該有剝離的前導零,也不能用逗號,句點,空格等表示......這取決於文化。像輸入不正確數據那樣的「快捷方式」通常最終會花費IME。 (而且,是的,我將電話號碼存儲爲一次數字,然後燒燬。) – Terry

0

他們是如此之少以至於您不需要擔心這一點,儘管對整數類型應用檢查約束會更簡單。

1

給出一個選項,我知道數據類型將始終爲整數,我將使用較小的整數 - smallint/tinyint(取決於所需的範圍)。

雖然我不期望在性能上有太大的區別。

1

你打算如何使用它們,並做任何有領先的零?

如果你要了通常存儲爲串電話號碼的組合,你想將它們存儲爲一個字符串,以及或者你會浪費處理能力在每一個查詢轉換他們。

如果你不打算做數學或與它連接,它是problably一個壞主意,存儲爲一個數字。你的數據集可能很小,字符串很小(300是最大值),因此使用int可能無法讓你獲得任何連接。

+0

這是一個很好的觀點:如果有任何領先零的機會,那麼字符串是唯一的選擇。但是,對於國家代碼,不存在前導零。 – frenchie

1

國家代碼是字符串(儘管它們只使用字符0..9)並且應該像這樣存儲。

0

我的經驗法則一直是......我需要一個平均值嗎?例如,您可以將整個郵政編碼存儲爲整數,但您是否需要平均郵政編碼?可能不會。因此,存儲爲字符..除非你可能需要超過5個字符,在這種情況下,存儲爲varchar。

相關問題