本文匯總 MySQL 所有整數與位元類型的定義語法、儲存空間、有號/無號範圍、別名關係,供開發、審查、遷移時快速查閱決策。
| 類型 | 語法 | 位元數 | 有號範圍 | 無號範圍 | 儲存位元組 | 別名/備註 |
|---|---|---|---|---|---|---|
| BIT | BIT[(M)] |
M (1~64,預設 1) | N/A | 0 ~ 2^M-1 | 約 (M+7)/8 bytes | 5.0+ 獨立類型,非 TINYINT 同義詞 |
| TINYINT | TINYINT[(M)] [UNSIGNED] [ZEROFILL] |
8 | -128 ~ 127 | 0 ~ 255 | 1 | 最小整數 |
| BOOL / BOOLEAN | BOOL / BOOLEAN |
8 | -128 ~ 127 | 0 ~ 255 | 1 | TINYINT(1) 同義詞,0=false,非0=true |
| SMALLINT | SMALLINT[(M)] [UNSIGNED] [ZEROFILL] |
16 | -32,768 ~ 32,767 | 0 ~ 65,535 | 2 | 小整數 |
| MEDIUMINT | MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] |
24 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 3 | 中等整數 |
| INT / INTEGER | INT[(M)] [UNSIGNED] [ZEROFILL]INTEGER[(M)] [UNSIGNED] [ZEROFILL] |
32 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 4 | INT = INTEGER 同義詞,標準整數 |
| BIGINT | BIGINT[(M)] [UNSIGNED] [ZEROFILL] |
64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | 8 | 大整數 |
(M):顯示寬度,不限制儲存範圍。INT(1) = INT(11) = INT(20)。配合 ZEROFILL 左補零顯示UNSIGNED:無號屬性,範圍變為 0 ~ 2^N-1,空間不變,效能相同ZEROFILL:隱含 UNSIGNED,顯示時左側補零至寬度 MBOOL/BOOLEAN:純語法糖,儲存為 TINYINT(1)。未來版本可能引入真正布林類型數值特徵 → 推薦類型
----------------------------------------------------------
布林旗標、0/1 狀態 → TINYINT(1) / BOOL
極小範圍枚舉 (0~255) → TINYINT UNSIGNED
小範圍 ID/計數 (0~65K) → SMALLINT UNSIGNED
中等 ID/RGB/大計數 → MEDIUMINT UNSIGNED
通用主鍵/外鍵/業務 ID → INT UNSIGNED / BIGINT UNSIGNED
分散式系統全域唯一 ID → BIGINT UNSIGNED (雪花算法等)
精確金額 (分為單位) → BIGINT UNSIGNED
Unix 時間戳 (秒) → INT UNSIGNED
Unix 時間戳 (毫秒) → BIGINT UNSIGNED
位元旗標組合 (ACL/權限) → INT UNSIGNED / BIGINT UNSIGNED + 位運算
| 陷阱 | 後果 | 避免方法 |
|---|---|---|
以為 INT(4) 限制 4 位數 |
可存 100000,邏輯錯誤 | 忽略 (M),應用層驗證或 CHECK 約束 |
金額用 FLOAT/DOUBLE |
精度誤差,對帳永遠差分 | 用 DECIMAL(10,2) 或 BIGINT 存分 |
| 無號欄位插入負數 | 變為巨大正數 (模 2^N) | 應用層嚴格檢查,資料庫 CHECK (col >= 0) |
| 自增 ID 用 SMALLINT | 超過 65535 立即報錯 | 預估 10 年增長,最小用 INT |
| 以為 BOOL 佔 1 bit | 實際佔 1 byte (TINYINT) | 理解同義詞本質,需極致省空間用位運算 |