2011-07-29 70 views
3

我們假設我想將印度手機號碼存儲在MySQL表中,因爲記錄數量非常大,所以我想優化我的存儲空間。 印度手機號碼是10位數字,通常以7,8或9開頭。 例如9XXXXXXXXX如何分配N個字節來存儲整數而不是4個字節或8個字節在mysql中?

相關MySQL的領域是:

Type Storage  Minimum Value   Maximum Value 
      (Bytes)  (Signed/Unsigned)  (Signed/Unsigned) 

INT  4   -2147483648    2147483647 
          0     4294967295 <-- somewhat small 

BIGINT 8  -9223372036854775808  9223372036854775807 
         0    18446744073709551615 <-- too large 

可以看出,無符號整型是小了一點(約在值的一半),和無符號BIGINT是非常大的存儲一個10位數字。 5個字節足以存儲這些數據。

我的問題是: -

一)是否有分配字節的自定義數字和MYSQL這個數據存儲在任何類型的可用數據類型的好辦法嗎?

b)這是不成熟的優化嗎?試圖這樣做有沒有優勢/劣勢?

c)具有4字節和8字節數字等自然大小的數據類型,忽略數據庫中的5字節和6字節等中間大小有什麼好處?

注意:假設10位數字不是電話號碼,而是10位數字的整數。 VARCHAR不是我正在尋找的。

回答

3

我同意@diEcho你應該使用VARCHAR()作爲電話號碼。在我的一生中,我有6位數,7位數,9位數字(因爲我經常在不同的縣,需要給國家代碼和我的號碼)13位數字。

這裏的經驗法則是,除非你打算做算術運算,或者你真的需要像「20> 9」這樣的比較結果是真的,否則將這些數據留作字符。

如果遇到類似的問題,需要固定數量的數字不容易放入INT或BIGINT中,並且需要進行數值比較,則只需使用DECIMAL(不帶小數點區分符),如DECIMAL(9 )。

+0

謝謝。這有幫助。 – DhruvPathak

0

不使用int或BIGINT..use VARCHAR(10)並插入到數據庫之前,消毒數據..

有很多內置的功能是MySQL和PHP(我假設你使用PHP)

所有,如果以後你一定要選擇,然後使用

BIGINT UNSIGNED 
+0

would not varchar是10 + 1 = 11個字節的大小?我正在尋找任何整數解決方案是可能的。 – DhruvPathak

2

一個電話nymber是(與名字)不是一個數字。電話號碼,郵政編碼,序列號等都是文本數據,因此您應該將其存儲爲文本(CHAR(10)/ VARCHAR(10 +保留) - ascii歸類)。這當然會導致更大的存儲需求,但會是那麼大?無論如何你會存儲多少個號碼?

稱爲ICQ的IM用於在數字字段中存儲電話號碼。我如何知道這一點?因爲我的號碼以0開頭

1

電話號碼並不是真正的數字,因爲我們不會對它們進行算術運算。例如INT和BIGINTs的數量是4和8個字節,因爲計算機自然會用這種大小進行算術運算。

自然要做的是將電話號碼視爲CHAR(10)。你可能認爲這是低效率的 - 使用5個5字節的10個字節,但是考慮到你的總體數據量(當然其他數據比如名字和地址是非常大的)我懷疑每個記錄會浪費5個字節的成本許多。磁盤空間很便宜,程序員的時間很昂貴,做最簡單的工作。

+0

另外,當考慮到將字符無限制地轉換爲二進制文件並再次返回的CPU的「開銷」時,5字節磁盤空間的「保存」將會丟失。 –

相關問題