核心觀點
合理的資料類型選型 = 節省儲存空間 + 提升查詢效能 + 避免隱式轉換坑。本文系統梳理數值、日期、字串、枚舉四大類型的選型邏輯與實戰策略。
數值類型:三大族群、精準定位
整數:越小越好、夠用即止
- TINYINT (1B) → 狀態、布林、小計數
- SMALLINT (2B) → 業務代碼、層級
- MEDIUMINT (3B) → 千萬級自增主鍵
- INT (4B) → 通用主鍵、外鍵
- BIGINT (8B) → 分散式 ID、海量主鍵
案例:1600 萬行表用 MEDIUMINT 代替 INT,節省 1600萬 × 1B ≈ 15.3 MB。
定點數 DECIMAL:金額、精度敏感欄位的唯一正解
- 以字串逐位儲存,運算零誤差
- 價格
DECIMAL(10,2)、匯率 DECIMAL(18,6)
- 空間較大但值得
浮點數 FLOAT/DOUBLE:科學計算專用,業務系統慎用
日期時間:按需分配、時區決策
| 型別 | 空間 | 適用 |
| DATE | 3B | 純日期 |
| TIME | 3B | 純時間 |
| DATETIME | 8B | 通用、無時區轉換 |
| TIMESTAMP | 4B | 跨時區、自動更新 |
| YEAR | 1B | 僅年份 |
字串類型:定長 vs 變長、大文本分級
CHAR vs VARCHAR 選型公式
AVG_LENGTH / MAX_LENGTH > 0.9 → CHAR,否則 VARCHAR。
- 股票名稱(固定 4 字) →
CHAR(8)(UTF-8 下 4 字 = 12B,建議 CHAR(12))
- 股票代碼(滬 6 位、深 4 位) → 滬深比例高 →
CHAR(6) 更省
TEXT 家族:按長度分級
- TINYTEXT (255B) → 短備註
- TEXT (64KB) → 摘要、日誌
- MEDIUMTEXT (16MB) → 正文、HTML
- LONGTEXT (4GB) → 極大文檔
枚舉 ENUM / 集合 SET:極致壓縮的業務碼
- 性別:
ENUM('M','F') 1 字節,媲美 TINYINT 但可讀性強
- 訂單狀態:
ENUM('new','paid','shipped','done','cancel')
- 文章標籤:
SET('tech','life','travel','food')
注意:修改成員需 ALTER TABLE、不支援外鍵、跨資料庫遷移需轉換。
建庫策略五原則
- 業務精度優先:金額必用 DECIMAL,日期按時區選 TIMESTAMP/DATETIME
- 空間最小化:整數選最小夠用型別,字串定長/變長精算
- 避免隱式轉換:JOIN/WHERE 兩側型別、編碼、長度完全一致
- 預留擴充空間:VARCHAR 長度留 20% 餘量,ENUM 預留未來值
- 文檔化與評審:建立資料字典,上線前 DBA + 開發聯合評審
結語
資料類型選型不是一次性動作,而是伴隨業務演進的持續優化。建立「選型 → 驗證 → 監控 → 調整」閉環,才能讓資料庫在 TB 級資料下依然穩健高效。