INT 整數型態
儲存位元 | 最小值 | 最大值 | |
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8,388,608 | 8,388,607 (838萬) |
INT | 4 | -2147483648 | 2,147,483,647 (21億) |
BIGINT | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 (922京) |
* 如果輸入值超過範圍會出現 #1264 - Out of range value for column 錯誤
* 如果 update 超過範圍也會出現 #1264 - Out of range value for column 錯誤,不會再出現翻轉的問題
* 修改為無正負號的類型(UNSIGNED TYPE)
ALTER TABLE `table` CHANGE `col` `col` TINYINT(1) unsigned NOT NULL
FLOAT 浮點型態
儲存位元 | 最小值 | 最大值 | 有效位數 | |
FLOAT | 4 | -3.402823466E+38 | 3.402823466E+38 | ~ 7 |
DOUBLE | 8 | -1.7976931348623157E+308 | 1.7976931348623157E+308 | ~ 17 |
DECIMAL* | 每9個數字4個位元 | ~ -1E+66 | ~ 1E+66 | 1~65 |
* REAL 是DOUBLE的別名,但如果設定 REAL_AS_FLOAT 的模式中為 FLOAT 的別名。
* DEC、NUMERIC 是 DECIMAL的別名
* DECIMAL 使用方式:
DECIMAL(M,D) => 總共M個數字和D個小數位數;M的範圍是1~65;D的範圍是0~30;且M>=D。
DECIMAL(6,4) => 總共6位數字,含小數點4位,數字範圍 99.9999 ~ -99.9999
* DECIMAL會先運算後四捨五入處理多餘的小數,例如 DECIMAL(3,2) 1+0.005 = 1.01
* 設定超過 DECIMAL長度範圍的值,會出現錯誤
#1425 - Too big scale 48 specified for column 'colname'. Maximum is 30. 小數位數超過30
#1426 - Too big precision 66 specified for column 'colname'. Maximum is 65. 字元數超65
* 如果 update 超過範圍也會出現 #1264 - Out of range value for column 錯誤,不會再出現翻轉的問題
* 變更為DECIMAL類型
ALTER TABLE `test` CHANGE `col` `col` DECIMAL(30.20) NOT NULL DEFAULT '0';
* FLOAT、DOUBLE、DECIMAL使用時機:
float 和double型態是使用「近似值」來儲存你的數值,double 比 float 可儲存數值範圍和有效數字較大,儲存空間也大一倍,適合數理計算使用。
decimal 型態就可以用來儲存完全精準的數值,有效數字最多可達65位,最大和最小值比double來得小,適合會計、金融使用。
* 假設我有四個欄位 ABCD,給他們輸入根號2,不同類型的結果:
設定
寫入資料
update `test` set A='1234567890.1234567890123456789012345678901234567890',
B='1234567890.1234567890123456789012345678901234567890',
C='1234567890.1234567890123456789012345678901234567890',
D ='1234567890.1234567890123456789012345678901234567890'
結果
結論
float 最大的問題是有效位數只有7個,其他會亂塞值(磁碟中未清除的位元?),所以只能用在精準度要求不高的地方,避免使用。
double 適合一般般數理運算使用,可以存很大的數字,但有效位數約17個,mysql內建的數學函式也是以此型態作為運算基準
decimal 是精準數值,占用空間比較大,適合算和錢有關的,或是需要存較精準的數字。
TEXT/CHAR/BLOB 文字型態
文字類型 /二進位資料類型 | 記錄長度位元 | 最大長度 |
TINYTEXT /TINYBOLB | 1 | 255 |
TEXT /BOLB | 2 | 65,535 (65KB) |
MEDIUMTEXT /MEDIUMBOLB | 3 |
16,777,215(16MB) |
LONGTEXT /LONGBOLB | 4 | 4GB |
CHAR /BINARY | 1 | 255 |
VARCHAR /VARBINARY | 2 | 65,535 255 ( ver.<5.0.3) |
* CHAR 固定長度 (0 至 255,預設為 1) 的字串,在儲存長度不足時會自右邊補足空白
* VARCHAR 可變長度 (0-65,535) 的字串,最大的有效長度需視資料列大小限制而定
* CHAR、VARCHAR 和 TEXT的差異:
VARCHAR/CHAR 可以給預設值;TEXT沒辦法給預設值
VARCHAR/CHAR 建索引可不指定索引長度,但TEXT一定要指定長度
CHAR 是固定長度,長度不足會補空白在右邊,VARCHAR、TEXT不會。
* BOLB 型態和TEXT都相同,只是BLOB專門拿來存二進位的資料,例如圖檔。
參考資料
[1] http://stackoverflow.com/questions/4834390/how-to-use-mysql-decimal
[2] http://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html
[3] http://wubx.net/varchar-vs-text/
[4] http://dev.mysql.com/doc/refman/5.7/en/blob.html