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。