INT(M) 中的 M 僅為「顯示寬度」,完全不限制儲存範圍、不影響儲存空間。
INT 固定佔 4 位元組 (32 位),有號範圍 -2^31 ~ 2^31-1,無號 0 ~ 2^32-1BIGINT 固定 8 位元組 (64 位)ZEROFILL 時的左側填零顯示
CREATE TABLE t (
c1 INT(5) ZEROFILL,
c2 INT(3) ZEROFILL
);
INSERT INTO t VALUES (4, 4), (12345, 12345);
SELECT * FROM t;
-- 結果:
-- c1 | c2
-- 00004 | 004
-- 12345 | 12345 (超過寬度不截斷)
注意:ZEROFILL 隱含 UNSIGNED。
若在整數欄位儲存超過顯示寬度的值,MySQL 建立複雜 JOIN 臨時表時會「信任」原始寬度,可能導致資料截斷或錯誤。
實務建議:不要依賴 M 限制資料,業務邏輯在應用層驗證。
| 類型 | 位元組 | 有號範圍 | 無號範圍 |
|---|---|---|---|
| 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 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
String.format("%05d", id) 或 LPAD(id, 5, '0') (SQL)ZEROFILL:綁定顯示邏輯於資料庫、遷移困難