無數開發者誤以為 INT(1) 只能存 1 位數、INT(11) 存 11 位。實則 INT(M) 中的 M 僅為顯示寬度,與存儲範圍、佔用空間無任何關係。本文徹底釐清誤區,揭示 ZEROFILL 才是顯示寬度生效的前提。
| 屬性 | INT(1) | INT(11) | 說明 | |
|---|---|---|---|---|
| 存儲字節 | 4 字節 | 4 字節 | 完全相同 | |
| 有符號範圍 | -2147483648 ~ 2147483647 | -2147483648 ~ 2147483647 | 完全相同 | |
| 無符號範圍 | 0 ~ 4294967295 | 0 ~ 4294967295 | 完全相同 | |
| 顯示寬度 | 1 | 11 | 僅影響 ZEROFILL 填充 | |
| 插入 9999999999 (10位) | ✅ 成功 | ✅ 成功 | 不受 M 限制 |
| 定義 | 存入 1 | 存入 99 | 存入 9999 | 存入 10000 |
|---|---|---|---|---|
INT(4) UNSIGNED ZEROFILL | 0001 | 0099 | 9999 | 10000 (超寬不截斷) |
INT(2) UNSIGNED ZEROFILL | 01 | 99 | 9999 | 10000 |
INT(4) (無 ZEROFILL) | 1 | 99 | 9999 | 10000 |
INT(2) (無 ZEROFILL) | 1 | 99 | 9999 | 10000 |
| 類型 | 字節 | 有符號範圍 | 無符號範圍 |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT / INTEGER | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
FLOAT(M,D) / DOUBLE(M,D) / DECIMAL(M,D)
M = 總位數(精度), D = 小數位數(標度)
-- 例:FLOAT(7,4) 可存 -999.9999 ~ 999.9999
-- 插入 999.00009 → 四捨五入為 999.0001
不同於整數,浮點類型的 (M,D) 確實限制存儲範圍和精度。
CHECK (age BETWEEN 0 AND 150) 或應用層驗證CREATE TEMPORARY TABLE ... SELECT * FROM t 可能不複製顯示寬度屬性INT(11),純屬歷史慣例,無實際意義INT 而非 INT(11)INT(6) ZEROFILLBIGINT,預留 64 位空間TINYINT UNSIGNED,省空間INT(11) 是 MySQL 歷史遺留的「顯示寬度建議值」,與存儲零關係。拋棄誤解,關注真正影響存儲與性能的:類型選擇、UNSIGNED、ZEROFILL、索引設計。