2010-10-29 85 views
1

我認爲標題說明了一切。 將8位無符號數字存儲爲Int或char(8)類型會更好嗎(更快,節省空間(根據內存和磁盤)? 當我使用固定的字符長度時,如果將來數字將變爲9位數,我會不會遇到麻煩?SQL Server數據類型:將8位無符號數存儲爲INT或CHAR(8)?

背景-信息:我想存儲TAC小號

感謝

+0

空間是毫不費力的 - 8位數字將適合4個字節,因此SQL INTEGER足夠存儲。 – StuartLC 2010-10-29 09:38:49

+0

TAC不是數字。它是數字標識符(字符串)。 – TomTom 2010-10-29 09:51:07

+0

TAC不是數字。這是一個自由的人! – Jay 2010-10-29 21:14:52

回答

2

如果是一個數字,將其存儲爲一個數字。

整數使用4 bytes存儲,給他們的範圍內:

-2^31(2,147,483,648)至2^31-1(2,147,483,647)

所以,適合您的需要。

char[8]將存儲爲8 bytes,所以雙倍的存儲,當然從需要在未來擴大遭受(轉換爲8至9個字符幾乎10M記錄將需要時間,可能會需要對數據庫脫機的持續時間)。因此,從存儲,速度,內存和磁盤使用(所有與數據類型使用的字節數有關),可讀性,語義和未來打樣,int勝過所有。


更新

現在你已經澄清,你是不是存儲數字,我會說,你將不得不使用char爲了保留前導零。

至於未來擴展的問題 - 因爲char是固定長度字段,從char[8]更改爲char[9]不會丟失信息。但是,我不確定是否會在右側或左側添加其他字符(儘管可能未確定)。您必須進行測試,並且一旦該字段已擴展,您將需要確保原始數據已保存。

一個更好的辦法可能是創建一個新的char[9]場,所有char[8]數據遷移到它(讓事情變得可靠和一致的),然後取出char[8]場和新場重命名爲原來的名稱。當然,這會破壞桌子上的所有統計數據(但是直接擴展字段也是如此)。

1

棒爲INT爲這一個,DEFFINITELY INT(OR BIGINT)

看一看int, bigint, smallint, and tinyint (Transact-SQL)

從-2^31 (-2,147,483,648)到2^31 - 1 0的整數(整數)數據(2,147,483,647)。存儲大小爲4個字節 ,從-2^63 (-9,223,372,036,854,775,808)通過 2^63-1(9,223,372,036,854,775,807)

BIGINT(整數)的數據。 存儲大小是8個字節。

相比

char and varchar

固定長度非Unicode字符 數據具有n個字節的長度。 n必須是 從1到8,000的值。存儲 大小爲n個字節。

而且,一旦你對查詢這個,你將不得不降低性能,如果您使用整數相比,你char列,如SQL Server將不得不做鑄你...

+0

我補充說,我需要它來存儲TAC是唯一的數字標識符。其他人提到,由於前導零,字符會更好。不管怎麼說,還是要謝謝你。確切地說, – 2010-10-29 10:12:21

4

鑑於TAC可以具有前導零,它們實際上是一個不透明的標識符,並且從不計算,使用char列。

在確定已正確建模數據類型之前,不要開始對空間進行優化。

編輯

但爲了避免在那裏得到的垃圾,確保應用CHECK約束也。 E.g如果它的意思是8位數字,加

CONSTRAINT CK_Only8Digits CHECK (not TAC like '%[^0-9]%' and LEN(RTRIM(TAC)) = 8) 
+0

。這不是NU NUMBER,它是一個數字標識符。你永遠不會做數學,但你可能想要查找以特定數字結尾或包含某些數字的所有數字。根據定義不是數字。 – TomTom 2010-10-29 09:50:05

+0

謝謝澄清。我會在後端添加前導零,但我認爲這可能會導致更多的問題,而不是保持原樣。Char(10)在這種情況下是最好的,不是嗎?因爲將來可能會改變數字的數量。 – 2010-10-29 10:08:41

+0

@Tim Schmelter - 我對這個特定領域並不熟悉 - 目前正在討論這種變化,還是因爲N年(N與系統的預計壽命相比較而言較小)?如果是,那麼是的,我可能會製作一個更寬的專欄。 – 2010-10-29 10:12:22

2

的int將使用較少的內存空間,並給予更快的索引比一個字符。

如果你需要分開這些數字 - 搜索數字3-4是「02」或一些這樣的一切 - 字符會更簡單,可能更快。

我收集你沒有對他們做算術。您不會將兩個TAC添加到一起,或者找到一組記錄或類似的任何記錄的平均TAC。如果你是這樣的話,那將是使用int的一個滿貫的解釋。

如果它們具有前導零,則它可能更易於使用char,因此您不必始終用零填充正確長度的數字。

如果以上都不適用,則無關緊要。我可能會使用char。我無法想出任何一種令人信服的理由。

相關問題