| 類型 | 存儲字節 | 有符號範圍 | 無符號範圍 | 典型用途 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾標誌、枚舉狀態、極小計數 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 較小計數、年齡、郵編、短整數 ID |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、IPv4 整數存儲 |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用主鍵 ID、計數器、外鍵 |
| BIGINT | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | 超大 ID、時間戳毫秒、分布式 ID (Snowflake) |
CREATE TABLE t (
id1 INT(3),
id2 INT(11),
id3 BIGINT(20)
);
INT(3)、INT(11) 皆佔 4 字節;BIGINT(20) 佔 8 字節。INSERT INTO t VALUES (5, 5, 5);SELECT * FROM t; → 005 | 00000000005 | 00000000000000000005(需定義 ZEROFILL 才生效)。INT(3) 仍可插入 2147483647,超出顯示寬度照常存儲,僅顯示時不補零。CREATE TABLE t (
signed_int INT,
unsigned_int INT UNSIGNED
);
INSERT INTO t VALUES (-1, 4000000000); -- unsigned 可存 40 億,signed 會溢出報錯
UNSIGNED 將範圍正向擴展一倍,適合「絕不為負」的業務字段(ID、計數、時間戳)。SELECT unsigned_int - signed_int 會隱式轉為無符號,負數結果變巨大正數;建議統一使用有符號或在應用層處理。TINYINT UNSIGNEDSMALLINT UNSIGNEDINT UNSIGNED(主鍵首選)BIGINT UNSIGNEDUNSIGNEDBIGINT 索引佔用雙倍內存/磁盤,緩存命中率下降。「夠用就好,越小越好」。主鍵優先 INT UNSIGNED(42 億足夠 99% 業務),分布式 ID 才用 BIGINT。拒絕盲目 BIGINT(20),理解 M 僅為顯示提示,不影響存儲與範圍。