選對資料類型 = 省空間 + 快查詢 + 免災難。本文依類別詳細解析 MySQL 主流型別的儲存特性、適用場景與選型口訣。
| 型別 | 位元組 | 無號最大值 | 典型用途 |
|---|---|---|---|
| TINYINT | 1 | 255 | 狀態碼、布林、年齡 |
| SMALLINT | 2 | 65,535 | 技能值、小計數器 |
| MEDIUMINT | 3 | 16,777,215 | 千萬級自增主鍵 |
| INT | 4 | 4,294,967,295 | 通用主鍵、外鍵 |
| BIGINT | 8 | 1.84×10¹⁹ | 分散式 ID、大數據主鍵 |
口訣:夠用就好、越小越好。千萬行表用 MEDIUMINT 代替 INT 可省 10MB+。
DECIMAL(p,s) / NUMERIC:金額必備DECIMAL(10,2)、DECIMAL(18,4)FLOAT/DOUBLE:科學計算專用| 型別 | 範圍 | 空間 | 選型建議 |
|---|---|---|---|
| DATE | 1000-01-01 ~ 9999-12-31 | 3B | 純日期(生日、訂單日) |
| TIME | -838:59:59 ~ 838:59:59 | 3B | 純時間(工時、時段) |
| DATETIME | 1000 ~ 9999 年 | 8B | 通用日期時間,無時區轉換 |
| TIMESTAMP | 1970 ~ 2038 年 | 4B | 需時區自動轉換、自動更新 |
| YEAR | 1901 ~ 2155 | 1B | 僅需年份 |
關鍵差異:TIMESTAMP 存儲 UTC,讀取時按 session 時區轉換;DATETIME 原樣存取。跨時區應用首選 TIMESTAMP。
| 型別 | 儲存方式 | 適用場景 |
|---|---|---|
| CHAR(n) | 固定 n 字節,不足右補空格 | 固定長度:股票代碼、MD5、UUID、國家代碼 |
| VARCHAR(n) | 實際長度 + 1~2 字節長度前綴 | 可變長度:姓名、標題、郵件、地址 |
決策點:若 90%+ 行長度接近上限 → CHAR;否則 VARCHAR。
| 型別 | 最大長度 | 額外空間 | 用途 |
|---|---|---|---|
| TINYTEXT | 255 B | +1 B | 短備註 |
| TEXT | 64 KB | +2 B | 文章摘要、日誌 |
| MEDIUMTEXT | 16 MB | +3 B | 長文、HTML 內容 |
| LONGTEXT | 4 GB | +4 B | 極大文檔、二進制序列化 |
ENUM('v1','v2',...):單選,最多 65,535 個值,1~2 字節。例:性別 ENUM('M','F')、狀態 ENUM('on','off','pending')SET('v1','v2',...):多選,最多 64 個成員,1~8 字節。例:標籤 SET('tech','life','travel')優點:直接用字串讀寫、空間極小。缺點:修改成員需 ALTER TABLE、不可用於外鍵、遷移他資料庫不便。
| 業務場景 | 推薦型別 | 備註 |
|---|---|---|
| 用戶 ID(千萬級) | MEDIUMINT UNSIGNED AUTO_INCREMENT | 省 25% 空間 |
| 商品價格 | DECIMAL(10,2) | 嚴禁 FLOAT |
| 訂單建立時間 | DATETIME / TIMESTAMP | 跨時區用 TIMESTAMP |
| 手機號 | CHAR(11) | 固定長度 |
| 文章內容 | MEDIUMTEXT | 視長度升級 |
| 訂單狀態 | ENUM('new','paid','shipped','done','cancel') | 可讀性佳 |
資料類型選型是資料庫設計的地基。原則只有三條:精度滿足業務、空間越小越好、避免隱式轉換。上線前用 EXPLAIN 驗證索引是否生效,上線後定期 ANALYZE TABLE 更新統計資訊,讓類型選型持續發揮效能紅利。