確定資料類型的第一步是分類:數值型、字串型、時間型、空間型、JSON 型。第二步是在同類型中選擇具體子類型,依據:儲存範圍、精度要求、空間效率、特殊行為屬性。MySQL 為相容性提供別名(如 INTEGER=INT、BOOL=TINYINT(1)),不影響效能但易混淆,建議統一使用標準名稱。
| 類型 | 位元數 | 有號範圍 | 無號範圍 | 儲存位元組 | 典型應用場景 |
|---|---|---|---|---|---|
TINYINT |
8 | -128 ~ 127 | 0 ~ 255 | 1 | 布林旗標、狀態碼、小範圍枚舉、年齡 |
SMALLINT |
16 | -32,768 ~ 32,767 | 0 ~ 65,535 | 2 | 郵遞區號、小型 ID、年份、百分比(0~10000) |
MEDIUMINT |
24 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 3 | 中等規模 ID、RGB 色彩值(0~16777215)、計數器 |
INT / INTEGER |
32 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 4 | 通用主鍵、外鍵、大多數計數器、時間戳 |
BIGINT |
64 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 8 | 超大 ID(分散式 ID)、毫秒時間戳、精確金額(分為單位) |
TINYINT UNSIGNED 0~255 vs -128~127)-1 插入無號欄位會變為最大值(模 2^N),應用層需嚴格驗證(M) 的真相INT(11)、INT(1)、INT(20) 儲存與計算完全相同M 僅影響交互式工具顯示寬度(如命令列客戶端),配合 ZEROFILL 時左側補零INT(3) 可存 1000000INT、BIGINT 等標準形式SUM、AVG)使用 DECIMAL 或 DOUBLE 避免溢位/ 回傳 DOUBLE,整除 DIV 回傳整數INT(5) ZEROFILL → 自動加 UNSIGNED,插入 123 顯示為 00123| 引擎 | 整數儲存特性 | 注意事項 |
|---|---|---|
| InnoDB | 標準儲存,主鍵聚簇索引按整數序排列 | 自增主鍵連續插入效能最佳 |
| MyISAM | 標準儲存,支援壓縮表 | 無交易支援,已淘汰 |
| Memory (HEAP) | 記憶體中定長儲存,VARCHAR 變為 CHAR |
重啟資料消失,僅適合暫存 |
| Falcon | 自有格式,使用者無法控制大小/壓縮 | 已停止開發 |
| ColumnStore / ClickHouse | 列式壓縮編碼(Run-length, Delta, Dictionary 等) | 整數壓縮極佳,類型選擇影響壓縮率 |
BIGINT UNSIGNED AUTO_INCREMENT(分散式系統)或 INT UNSIGNED AUTO_INCREMENT(單體/小規模)TINYINT UNSIGNED + 應用層常數映射(const STATUS_ACTIVE = 1)INT UNSIGNED 或 BIGINT UNSIGNED(視峰值)INT UNSIGNED 存 Unix 時間戳(秒),或 BIGINT UNSIGNED 存毫秒戳DECIMAL(10,2)(元,分)或 BIGINT(分/厘為單位整數)SMALLINT UNSIGNED 存萬分位 (0~10000) 或 DECIMAL(5,4)| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
金額用 FLOAT(10,2) |
0.1 + 0.2 ≠ 0.3,對帳永遠差分 | DECIMAL(10,2) 或 BIGINT 存分 |
自增 ID 用 SMALLINT |
超過 65535 立即報錯,業務中斷 | 預估 10 年增長量,最小用 INT |
INT(4) 以為限制 4 位數 |
插入 12345 成功,邏輯錯誤 | 應用層驗證或 CHECK 約束 (8.0.16+) |
| 無號欄位插入負數 | 變為巨大正數,查詢結果荒謬 | 應用層嚴格檢查,資料庫層 CHECK (col >= 0) |