「選對類型,效能一半」—— 數據類型決定了儲存空間、索引效率、計算精度與業務邊界。本文系統梳理 MySQL 四大族系 20+ 核心類型:定義、儲存字節、取值範圍、適用場景、選型陷阱與最佳實踐,打造「查得準、用得對、不浪費」的類型選型手冊。
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 典型場景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾標誌、枚舉狀態、極小計數 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 小範圍計數、年齡、郵編 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、RGB 顏色值 |
| INT / INTEGER | 4 | -21億 ~ 21億 | 0 ~ 42億 | 通用主鍵、業務 ID、計數器 |
| BIGINT | 8 | -922京 ~ 922京 | 0 ~ 1844京 | 分布式 ID、大數據量主鍵、時間戳毫秒 |
選型鐵律:能用較小類型絕不擴大;主鍵推薦 BIGINT UNSIGNED AUTO_INCREMENT;ZEROFILL 僅影響顯示,不改變儲存。
| 類型 | 字節 | 精度特性 | 適用場景 |
|---|---|---|---|
| FLOAT(M,D) | 4 | 單精度,約 7 位有效數字,近似值 | 科學計算、非精確測量、坐標 |
| DOUBLE(M,D) | 8 | 雙精度,約 15 位有效數字,近似值 | 高精度科學計算 |
| DECIMAL(M,D) / NUMERIC | M+2 概算 | 精確定點數,字串存儲,按四捨五入 | 金額、價格、匯率、精確比率 |
參數含義:M = 總位數(不含小數點),D = 小數位數。
金額鐵律:嚴禁 FLOAT/DOUBLE 存儲金額,必須用 DECIMAL(10,2) 或 BIGINT 存分/厘整數。
| 類型 | 字節 | 範圍 | 格式 | 核心差異 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 純日期,無時區 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | HH:MM:SS | 純時間/間隔 |
| YEAR | 1 | 1901 ~ 2155 | YYYY | 僅年份 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 無時區,靜態快照 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | YYYY-MM-DD HH:MM:SS | 時區感知,存儲 UTC,讀取轉換 |
選型決策樹:
TIMESTAMP(注意 2038 年上限)DATETIMEDATE/TIME 節省空間DATETIME(6)/TIMESTAMP(6)(5.6.4+)| 類型 | 長度特性 | 儲存開銷 | 適用場景 |
|---|---|---|---|
| CHAR(M) | 固定長 0~255 字符 | M 字符(右填充空格) | 定長代碼:MD5、UUID、國標代碼、性別 |
| VARCHAR(M) | 可變長 0~65,535 字符 | 實際長度 + 1~2 字節長度前綴 | 通用變長文本:姓名、標題、描述 |
| TINYTEXT | 255 字符 | L + 1 字節 | 極短文本 |
| TEXT | 65,535 字符 | L + 2 字節 | 中等文本:文章、日誌 |
| MEDIUMTEXT | 16,777,215 字符 | L + 3 字節 | 長文本 |
| LONGTEXT | 4,294,967,295 字符 | L + 4 字節 | 超長文本、JSON 文檔 |
關鍵差異**:
CHAR 固定長度,適合極短且長度恆定的值(如 CHAR(32) 存 MD5),不支援默認值 NULL 的情況下尾部空格會被截斷VARCHAR 變長,VARCHAR(255) 以上長度前綴佔 2 字節,建議業務實際上限設定TEXT 族系不支援默認值、不支援全長度索引(需前綴索引)、查詢可能產生臨時表,慎用於高頻查詢列| 類型 | 長度特性 | 儲存開銷 | 適用場景 |
|---|---|---|---|
| BINARY(M) | 固定長 0~255 位元組 | M 位元組 | 定長二進位:哈希值、加密密文、文件指紋 |
| VARBINARY(M) | 可變長 0~65,535 位元組 | 實際長度 + 1~2 字節 | 變長二進位:圖片縮略圖、序列化對象 |
| TINYBLOB | 255 位元組 | L + 1 字節 | 極小二進位 |
| BLOB | 65,535 位元組 | L + 2 字節 | 中等二進位:圖片、文檔 |
| MEDIUMBLOB | 16,777,215 位元組 | L + 3 字節 | 大二進位 |
| LONGBLOB | 4,294,967,295 位元組 | L + 4 字節 | 超大二進位 |
字符 vs 二進位本質**:CHAR/VARCHAR/TEXT 有字符集與校對規則,比較遵循校對;BINARY/VARBINARY/BLOB 無字符集,按位元組比較,大小寫敏感、無排序歧義。
DECIMAL 或整數放大TIMESTAMP;單時區/歷史數據 → DATETIMEutf8mb4,避免隱式轉換導致索引失效VARCHAR + 合理長度,或拆分到擴展表BIGINT UNSIGNED AUTO_INCREMENT,嚴禁 UUID/字串/業務鍵將此手冊納入團隊「數據字典規範」,新建表必經類型評審,從源頭杜絕「類型不匹配」引發的效能與業務雙重風險。