MySQl表設計細節之tinyint、smallint、mediumint、int 和bigint數據類型,float、double和decimal以及sign 和unsigned間範圍取值選擇

MySQL中float、double和decimal間的選擇

對於單精度浮點數Float:  當數據範圍在±131072(65536×2)以內的時候,float數據精度是正確的,但是超出這個範圍的數據就不穩定,沒有發現有相關的參數設置建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的數據

float和double求SUM的結果都是不精確的,只有decimal求SUM得到的是精準數值:

所以,decimal 類型是適合財務和貨幣計算的128位數據類型。

1、浮點數存在誤差問題;
2、對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
3、編程中,如果用到浮點數,要特別注意誤差問題,並儘量避免做浮點數比較;
4、要注意浮點數中一些特殊值的處理

整型,tinyint、smallint、mediumint、int 和bigint類型間的選擇

 

類型

字節

最小值

最大值

 

 

(帶符號的/無符號的)

(帶符號的/無符號的)

TINYINT

1

-128

127

 

 

0

255

SMALLINT

2

-32768

32767

 

 

0

65535

MEDIUMINT

3

-8388608

8388607

 

 

0

16777215

INT

4

-2147483648

2147483647

 

 

0

4294967295

BIGINT

8

-9223372036854775808

9223372036854775807

 

 

0

18446744073709551615

表格一共有四列分別表式:字段類型, 佔用字節數, 允許存儲的最小值, 允許存儲的最大值.

我們拿int類型爲例:

int類型, 佔用字節數爲4byte, 學過計算機原理的同學應該知道, 字節(byte)並非是計算機存儲的最小單位, 還有比字節(byte)更小的單位, 也就是位(bit),一個位就代表一個0或1; 8個位組成一個字節; 一般字節用大寫B來表示byte, 位用小寫b來表示bit.

計算機存儲單位的換算:

1B=8b

1KB=1024B

1MB=1024KB

那麼根據int類型允許存儲的字節數是4個字節, 我們就能換算出int UNSIGNED(無符號)類型的能存儲的最小值爲0, 最大值爲4294967295(即4B=32b, 最大值即爲32個1組成);

 

mysql的sign 和unsigned之間的選擇

帶符號和不帶符號的區別

探索一:正負數問題

拿tinyint字段來舉例,unsigned後,字段的取值範圍是0-255,而signed的範圍是-128 - 127。 那麼如果我們在明確不需要負值存在的情況下,通常是不要設置signed來支持負數的。 因爲只支持正數會讓存儲空間大一倍呢(當然我這種表達可能不準確)。 假設我們使用tinyint來存儲一些狀態值。 0表示刪除,1表示待付款,2表示已付款,3...。 突然來個需求要加訂單取消,一些有代碼潔癖的人就想,那就將定義爲:-1表示取消吧。 但是就因爲有了-1,我們說起來應該可以從0存到255的,結果就變爲了0-127。 所以一般情況下,我們不建議這樣設置

  字段設置爲unsigned後有一個問題是:

當select a - b from t時,a爲10,b爲12,那麼這時就會出現異常情況:ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`test`.`t`.`a` - `test`.`t`.`b`)'

所以注意這種情況即可

探索二:性能問題

嚴格講,在性能上是有細微的差別的。 unsigned的性能更好,當只存儲正整數的情況下。 因爲,當unsigned時,假設查詢值在500以下的數據,那麼MySQL會將範圍定義爲:0-500,而如果是signed,則查詢範圍爲:-2147483648 - 500。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章