mysql資料型別 int、tinyint、float與decimal的區別
1.int、tinyint、float.
它們都是(精確)整型資料型別,但是佔用位元組數和表達的範圍不同。首先沒有這個表就說不過去了:
只需要知道對應型別佔多少位元組就能推算出範圍了,比如int佔 4 bytes,即4*8=32bits,大約10位數字,也能理解為什麼int預設顯示位數是11。
遇到比較多的是tinyint和bigint,tinyint一般用於存放status,type這種數值小的資料,不夠用時可能會用smallint。bigint一般用於自增主鍵。
為了避免資料庫被過度設計,布林、列舉型別也採用tinyint。
需要注意的是:無論是定義為int(4)還是int(11)。所佔用的儲存空間是一定的。int(M)中的M只是代表顯示的寬度。
2.float與decimal
MySQL使用DECIMAL型別去儲存對精度要求比較高的數值,比如金額,也叫定點數,decimal在mysql記憶體是以字串二進位制儲存的。宣告語法是DECIMAL(M,D),佔用位元組 M+2 bytes。M是數字最大位數(精度precision),範圍1-65;D是小數點右側數字個數(標度scale),範圍0-30,但不得超過M。
也就是說decimal可以動態的規定佔用位元組的多少。
decimal計算佔用位元組數的方法:
佔用位元組數計算方法 —— 小數和整數分別計算,每9位數佔4位元組,剩餘部分如下表換算:
比如DECIMAL(18,9),整數部分和小數部分各9位,所以各佔4位元組,共8bytes
再比如DECIMAL(20,6),整數14位,需要4位元組存9位,還需3位元組存5位;小數6位,需3位元組。共10bytes
例如:定義一個decimal(7,3),所能表示的最大數值為-9999.999~9999.999.佔用4位元組。
123.12 -> 123.120,因為小數點後未滿3位,補0
123.1245 -> 123.125,小數點只留3位,多餘的自動四捨五入截斷
12345.12 -> 儲存失敗,因為小數點未滿3位,補0變成12345.120,超過了7位。嚴格模式下報錯,非嚴格模式存成9999.999。
單精度浮點數float佔4位元組,float標準語法允許通過FLOAT(M)的形式指定精度,但是這個精度值M只是決定儲存大小: 0-23與預設不指定效果相同,24-53就變成雙精度的DOUBLE了。
double 和 float 的區別是double精度高,有效數字16位(float精度7位)。但double消耗記憶體是float的兩倍,佔8位元組,double的運算速度比float慢得多。