類型(M, D):M=精度(總位數),D=標度(小數位數)
FLOAT(7,4) 範圍:-999.9999 ~ 999.9999999.00009 → 四捨五入存為999.0001| 類型 | 不指定(M,D)時 | 超出範圍行為 |
|---|---|---|
| FLOAT | 按實際精度存儲 | 截斷不報錯 |
| DOUBLE | 按實際精度存儲 | 截斷不報錯 |
| DECIMAL | 默認(10,0)即整數 | 報錯Data truncated |
CREATE TABLE t2( id1 FLOAT(5,2), id2 DOUBLE(5,2), id3 DECIMAL(5,2) ); -- 測試1: 插入1.23 → 三者均正常 -- 測試2: 插入1.234 → FLOAT/DOUBLE截斷為1.23,DECIMAL截斷為1.23 -- 測試3: 去除精度限制後插入1.234 ALTER TABLE t2 MODIFY id1 FLOAT, MODIFY id2 DOUBLE, MODIFY id3 DECIMAL; -- 結果: FLOAT/DOUBLE存1.234,DECIMAL變為(10,0)存1並報警告
(10,0),超出範圍報警告並截斷-- 價格/金額:精確到分,預留擴展 price DECIMAL(12,2) -- 支持9999999999.99 -- 比率/百分比:精確到小數點後4-6位 rate DECIMAL(5,4) -- 0.0000 ~ 9.9999 -- 經緯度:DOUBLE足夠,或DECIMAL(10,7) lat DOUBLE lng DOUBLE -- 避免陷阱:永遠顯式指定DECIMAL精度 -- 錯誤: DECIMAL -- 正確: DECIMAL(10,2)
INSERT INTO t2 VALUES(1.2345, 1.2345, 1.2345); SHOW WARNINGS; -- 必須檢查Warnings捕獲截斷 SELECT * FROM t2;