MySQL 數據類型深度選型:數值/日期/字符串/枚舉四大族系、空間效率與業務語義雙重視角
合理的類型選型是高性能、低存儲成本的基石。本文按數值、日期時間、字符串、枚舉/集合四大族系,從存儲字節、取值範圍、業務適用場景三個維度建立選型決策矩陣,並給出建庫實戰原則。
一、數值類型族系
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 典型場景 |
| TINYINT | 1 | -128~127 | 0~255 | 年齡、狀態碼、布爾標誌 |
| SMALLINT | 2 | -32768~32767 | 0~65535 | 遊戲技能值、小型字典 ID |
| MEDIUMINT | 3 | -838萬~838萬 | 0~1677萬 | 中等規模表自增 ID(<1600萬行) |
| INT | 4 | -21億~21億 | 0~42億 | 通用自增 ID、大多數業務 ID |
| BIGINT | 8 | -9京~9京 | 0~18京 | 分布式 ID、海量數據主鍵 |
| FLOAT | 4 | ±1.17E-38 ~ ±3.4E38 | - | 科學計算、非精確測量 |
| DOUBLE | 8 | ±2.22E-308 ~ ±1.7E308 | - | 高精度科學計算 |
| DECIMAL(p,s) | p+2 約 | 精確定點數 | - | 價格、金額、財務數據 |
選型鐵律
- 夠用即可:用戶年齡用 TINYINT,省 3 字節 vs INT
- 無符號優先:非負業務加
UNSIGNED,正數範圍翻倍
- 金額必用 DECIMAL:浮點數運算有誤差,
DECIMAL(10,2) 精確到分
- 自增 ID 右尺:<1600萬行用 MEDIUMINT 省 1 字節/行,億級表節省 100MB+
二、日期時間類型
| 類型 | 字節 | 範圍 | 精度 | 場景 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 天 | 生日、入職日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 秒 | 每日定時任務時間 |
| DATETIME | 8 | 1000 ~ 9999 年 | 秒 | 通用業務時間戳 |
| TIMESTAMP | 4 | 1970 ~ 2038 年 | 秒 | 自動更新時間戳、跨時區 |
| YEAR | 1 | 1901 ~ 2155 | 年 | 年份字典 |
關鍵差異:TIMESTAMP 存儲 UTC,讀取時按會話時區轉換;DATETIME 存原值。自動更新欄位首選 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
三、字符串類型
| 類型 | 存儲方式 | 最大長度 | 適用場景 |
| CHAR(n) | 固定長度,右填充空格 | 255 字節 | 定長代碼:股票代碼、MD5、ISO 國家碼 |
| VARCHAR(n) | 變長,1-2 字節長度前綴 + 內容 | 65535 字節 | 不定長文本:姓名、標題、描述 |
| TINYTEXT | 1 字節長度前綴 | 255 字節 | 極短文本備註 |
| TEXT | 2 字節長度前綴 | 64 KB | 文章正文、日誌詳情 |
| MEDIUMTEXT | 3 字節長度前綴 | 16 MB | 長文檔、郵件內容 |
| LONGTEXT | 4 字節長度前綴 | 4 GB | 巨大文本、二進制序列化 |
CHAR vs VARCHAR 決策
- 長度固定或差異極小 → CHAR(無長度前綴,CPU 友好)
- 長度變化大 → VARCHAR(空間友好)
- 實測:股票名稱多為 4 字(8 字節)→ CHAR(8) 最優;代碼滬深長度不同但滬市佔多數 → CHAR(6) 優於 VARCHAR(6)
四、枚舉與集合
| 類型 | 存儲 | 成員上限 | 選擇模式 | 典型場景 |
| ENUM | 1-2 字節 | 65535 | 單選(必選一) | 性別、狀態機、優先級 |
| SET | 1-8 字節 | 64 | 多選(可選零到多) | 標籤、權限位掩碼 |
亮點:ENUM('帥哥','美眉') 僅佔 1 字節,直接存字面值,比 TINYINT+映射表更直觀。
建庫策略總結
- 先定業務語義,再選最小足夠類型
- 數值優先無符號,金額強制 DECIMAL
- 字符串按長度分布選 CHAR/VARCHAR/TEXT
- 枚舉替代微型字典表,減少 JOIN
- 定期
ANALYZE TABLE 更新統計信息,助優化器決策