MySQL 資料類型選型:空間、效能與精度的平衡藝術
合理的資料類型選擇能節省 30-50% 儲存空間、提升索引效能、減少 I/O。本文系統整理數值、日期時間、字串、枚舉/集合四大類型的選型原則與實戰建議。
一、數值類型
整數類型 (精確、索引友善)
| 類型 | 位元組 | 無號範圍 | 有號範圍 | 典型用途 |
| TINYINT | 1 | 0 ~ 255 | -128 ~ 127 | 布林旗標、狀態碼、年齡、小型枚舉 |
| SMALLINT | 2 | 0 ~ 65,535 | -32,768 ~ 32,767 | 郵遞區號、中型計數、技能點數 |
| MEDIUMINT | 3 | 0 ~ 16,777,215 | -8,388,608 ~ 8,388,607 | 中等流水號、AUTO_INCREMENT (千萬級) |
| INT / INTEGER | 4 | 0 ~ 4,294,967,295 | -2,147,483,648 ~ 2,147,483,647 | 通用 ID、流水號、預設首選 |
| BIGINT | 8 | 0 ~ 1.84e19 | -9.22e18 ~ 9.22e18 | 分散式 ID、超大流水、時間戳毫秒 |
選型原則
- 夠用就好: 每欄位省 1 位元組,千萬列省 10 MB,億級省 100 MB
- 無號優先: ID、計數、關聯鍵皆非負,
UNSIGNED 翻倍正向範圍
- AUTO_INCREMENT 配合: 預估最大行數選最小型別
定點數:DECIMAL / NUMERIC (精確貨幣)
- 以字串形式儲存,每位數 1 位元組 + 小數點 1 位元組
DECIMAL(10,2) 佔 12 位元組,範圍 -99999999.99 ~ 99999999.99
- 價格、金額、費率、比例 必須用 DECIMAL,禁止 FLOAT/DOUBLE
浮點數:FLOAT / DOUBLE (科學計算)
| 類型 | 位元組 | 精度 | 範圍 | 適用 |
| FLOAT | 4 | ~7 位有效數字 | ±1.17e-38 ~ ±3.4e38 | 座標、感測器讀數、圖形計算 |
| DOUBLE | 8 | ~15 位有效數字 | ±2.22e-308 ~ ±1.8e308 | 高精度科學計算 |
民用系統極少需求,謹慎使用。
二、日期時間類型
| 類型 | 位元組 | 範圍 | 精度 | 適用場景 |
| YEAR | 1 | 1901 ~ 2155 | 年 | 出生年、年度統計 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 日 | 生日、訂單日期、日誌日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 秒 | 工時、時長、每日排程 |
| DATETIME | 8 (5.6.4 前) / 5+fsp | 1000 ~ 9999 | 微秒 (fsp) | 通用時間戳、不受時區影響 |
| TIMESTAMP | 4 (5.6.4 前) / 4+fsp | 1970 ~ 2038 | 微秒 (fsp) | 自動更新欄位、跨時區系統 |
關鍵差異
TIMESTAMP:儲存 UTC,讀取轉換為連線時區,ON UPDATE CURRENT_TIMESTAMP 自動更新
DATETIME:字面值儲存,不做時區轉換,範圍更大
- 5.6.4+ 兩者支援小數秒
DATETIME(3)、TIMESTAMP(3)
三、字串類型
定長 vs 變長
| 類型 | 儲存方式 | 空間計算 | 適用 |
| CHAR(n) | 固定 n 位元組,右補空格 | n 位元組 | MD5/UUID (CHAR(32)/CHAR(36))、ISO 代碼、固定長度代碼 |
| VARCHAR(n) | 實際長度 + 1/2 位元組長度前綴 | L + 1 (≤255) / L + 2 (>255) | 姓名、標題、描述、非固定長度文字 |
選型決策
- 長度固定且接近上限 → CHAR (避免 1 位元組前綴開銷)
- 長度變化大、平均遠小於上限 → VARCHAR
VARCHAR(255) 臨界點:超過 255 字元長度前綴變 2 位元組
大物件類型 (BLOB/TEXT 族)
| 類型 | 最大長度 | 長度前綴 | 適用 |
| TINYBLOB/TEXT | 255 B | 1 B | 短備註、標籤 |
| BLOB/TEXT | 64 KB | 2 B | 文章內容、JSON 文檔 |
| MEDIUMBLOB/TEXT | 16 MB | 3 B | 長文、小型二進位 |
| LONGBLOB/TEXT | 4 GB | 4 B | 大型文檔、影像、影音 |
最佳實務: 大物件拆分至獨立表 (垂直分表),主表僅存檔案路徑/雲端 URL,避免主表膨脹影響掃描效能。
四、枚舉與集合
| 類型 | 儲存 | 成員上限 | 選擇數 | 適用 |
| ENUM('a','b','c') | 1-2 位元組 (索引值) | 65,535 | 單選 | 性別、狀態、分類、優先級 |
| SET('a','b','c') | 1-8 位元組 (位元遮罩) | 64 | 多選 | 標籤、權限位元組、多屬性 |
ENUM 實戰優勢
-- 性別欄位
`gender` ENUM('male','female','other') NOT NULL DEFAULT 'other'
-- 插入
INSERT INTO users (gender) VALUES ('male'); -- 字串寫入,內部存 1
-- 查詢
SELECT * FROM users WHERE gender = 'female'; -- 索引查詢極快
-- 排序按定義順序,非字母順
ORDER BY gender; -- male(1), female(2), other(3)
五、選型檢查清單 (Code Review 用)
- ID 欄位是否
UNSIGNED?
- 金額欄位是否
DECIMAL(p,2)?
- 定長代碼是否用
CHAR?
- 狀態/分類是否用
ENUM?
- 大文本是否垂直分表?
- 時區敏感欄位是否用
TIMESTAMP?
- 索引欄位長度是否最小化 (前綴索引)?
資料類型是 Schema 設計的地基。每次建表前花 5 分鐘思考類型選擇,上線後能省下數倍的調優成本。
- 上一篇文章: MySQL 圖形化管理工具總覽:MySQL Workbench、phpMyAdmin、DBeaver 選型指南
- 下一篇文章: MySQL 查詢優化三大核心技術:索引、EXPLAIN 與參數調校
Copyright ©
程式碼之家 All Rights Reserved