合理選擇資料型別是資料庫設計的核心功夫,直接影響儲存空間、查詢效能、資料精度。本文系統整理 MySQL 主流型別特性、適用場景、選擇原則,助你設計高效精準的表結構。
| 型別 | 儲存 | 有號範圍 | 無號範圍 (UNSIGNED) | 適用場景 |
|---|---|---|---|---|
| TINYINT | 1 Byte | -128 ~ 127 | 0 ~ 255 | 年齡、狀態碼、布林值、小型枚舉 |
| SMALLINT | 2 Bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 郵遞區號、中型計數、權限位元遮罩 |
| MEDIUMINT | 3 Bytes | -8.3M ~ 8.3M | 0 ~ 16.7M | 中等流水號、自增 ID (≤1600萬行) |
| INT / INTEGER | 4 Bytes | -21.4億 ~ 21.4億 | 0 ~ 42.9億 | 通用自增 ID、外鍵、大計數 |
| BIGINT | 8 Bytes | -9.2京 ~ 9.2京 | 0 ~ 1.8垓 | 超大系統 ID、時間戳毫秒、科學計算 |
選擇原則:「夠用就好,越小越好」。1600萬行用 MEDIUMINT 省 10MB+ 空間,索引也更快。
DECIMAL(10,2) 共 10 位、小數 2 位| 型別 | 儲存 | 精度 | 最小絕對值 |
|---|---|---|---|
| FLOAT | 4 Bytes | ~7 位有效數字 | 1.17E-38 |
| DOUBLE | 8 Bytes | ~15 位有效數字 | 2.22E-308 |
民用系統極少用到,除非做科學計算、地理座標。
| 型別 | 儲存 | 範圍 | 精度 | 適用場景 |
|---|---|---|---|---|
| DATE | 3 Bytes | 1000-01-01 ~ 9999-12-31 | 天 | 生日、入職日期、純日期業務 |
| TIME | 3 Bytes | -838:59:59 ~ 838:59:59 | 秒 | 工時、時長、鬧鐘時間 |
| DATETIME | 8 Bytes | 1000 ~ 9999 年 | 秒 | 建立時間、訂單時間、通用時間戳 |
| TIMESTAMP | 4 Bytes | 1970 ~ 2038 年 | 秒 | 自動更新欄位、跨時區應用 |
| YEAR | 1 Byte | 1901 ~ 2155 | 年 | 年份欄位、統計維度 |
關鍵差異:TIMESTAMP 隨時區變化、範圍較小、4 Bytes;DATETIME 固定時區、範圍大、8 Bytes。5.6.5+ 版本 DATETIME 也支援 DEFAULT CURRENT_TIMESTAMP。
| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 儲存方式 | 固定 n 位元組 (右補空格) | 實際長度 + 1~2 位元組長度前綴 |
| 適用 | 長度固定/差異極小 (MD5、UUID、身分證、股票代碼) | 長度變動大 (姓名、標題、描述、地址) |
| 效能 | 讀取快、易碎片 | 儲存省、需額外長度字節 |
實戰判斷:股票代碼 (6位/4位混在) 用 CHAR(6) 比 VARCHAR(6) 更划算 (上海股多、定長優勢大於長度前綴成本)。
| 型別 | 最大長度 | 長度前綴 | 適用 |
|---|---|---|---|
| TINYTEXT | 255 B | 1 B | 短備註、標籤 |
| TEXT | 64 KB | 2 B | 文章內容、簡介 |
| MEDIUMTEXT | 16 MB | 3 B | 長文、日誌 |
| LONGTEXT | 4 GB | 4 B | 極大文檔、二進位序列化 |
gender ENUM('男','女','其他') -- 僅 1 Byte,直接存 '男'/'女'
permissions SET('讀','寫','刪','管理') -- 位元遮罩,可組合
FIND_IN_SET() 查詢MySQL 型別選擇核心原則:精確用 DECIMAL、整數用最小 INT、字串分定變長、日期按精度/時區選、枚舉集合善用語意化。每個 Byte 省下來,乘以億級行數就是 TB 級節省,索引也更輕更快。好架構從好型別開始。