MySQL 提供豐富的列類型,正確選型直接影響存儲空間、索引性能、查詢效率與業務擴展性。本文系統整理數值類型(整數/浮點/定點)、字符串類型(定長/變長/BLOB/TEXT/枚舉/集合)的存儲特徵、範圍、適用場景與選型原則。
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 默認顯示寬度 | 典型場景 |
|---|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 4 | 布爾標誌、狀態碼、極小計數 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 6 | 年齡、小範圍排序、中型計數 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 9 | 中等計數、IP 地址存儲 |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 11 | 主鍵 ID、用戶 ID、通用計數 |
| BIGINT | 8 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 20 | 大數據主鍵、時間戳毫秒、全局唯一 ID |
選型原則:夠用就行,越小越好。非負業務必加 UNSIGNED 獲得雙倍正數空間。主鍵優先 BIGINT UNSIGNED AUTO_INCREMENT。
| 類型 | 字節 | 精度 | 範圍 | 適用場景 |
|---|---|---|---|---|
| FLOAT | 4 | ~7 位有效數字 | ±3.4e38 | 科學計算、非精確金額 |
| DOUBLE / REAL | 8 | ~15 位有效數字 | ±1.7e308 | 高精度科學計算 |
| DECIMAL(M,D) / NUMERIC | M+2 字節 | 精確至 D 位小數 | 取決於 M,D | 金額、價格、比率、任何不可損失精度的業務 |
鐵律:涉及金錢、精確計算絕對用 DECIMAL。DECIMAL(10,2) 存 99999999.99,按字符串存儲,計算不丟失精度。
| 類型 | 字節 | 範圍 | 格式 | 場景 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 生日、入職日期 |
| 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 | YYYY-MM-DD HH:MM:SS | 自動更新時間戳、版本控制 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | HH:MM:SS | 持續時間、鬧鐘時間 |
| YEAR | 1 | 1901 ~ 2155 (4位) | YYYY | 年份統計 |
關鍵差異:TIMESTAMP 存儲 UTC、讀取時按會話時區轉換、自動初始化/更新;DATETIME 時區無關、範圍更大、佔用雙倍空間。5.6+ 支持 DATETIME(3) 毫秒精度。
| 類型 | 最大長度 | 存儲開銷 | 特點 | 場景 |
|---|---|---|---|---|
| CHAR(M) | 255 字符 | M 字節(定長) | 右填充空格、讀取去尾空格、索引極快 | 固定長度代碼:MD5、UUID、國家代碼、性別 |
| VARCHAR(M) | 65,535 字符 | 實際長度 + 1/2 字節 | 變長、不填充、65532 字節行長度限制 | 通用變長文本:名稱、標題、地址、JSON 片段 |
| TINYTEXT | 255 字符 | L + 1 字節 | 不支持默認值、不支持索引前綴長度 | 極短文本備選 |
| TEXT | 65,535 字符 | L + 2 字節 | 同上 | 文章內容、日志詳情 |
| MEDIUMTEXT | 16,777,215 字符 | L + 3 字節 | 同上 | 長文本、HTML 頁面 |
| LONGTEXT | 4,294,967,295 字符 | L + 4 字節 | 同上 | 超大文本、文檔存儲 |
BLOB 系列:TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB 對應 TEXT 系列,二進制存儲、大小寫敏感排序,用於圖片、文件流、加密數據。
| 類型 | 存儲 | 最大成員數 | 特點 | 場景 |
|---|---|---|---|---|
| ENUM('v1','v2',...) | 1-2 字節 | 65,535 | 單選、內部存數字索引、按定義順序排序 | 狀態機:pending/paid/shipped/cancelled |
| SET('v1','v2',...) | 1-8 字節 | 64 | 多選、位掩碼存儲、FIND_IN_SET 查詢 | 標籤、權限掩碼、多屬性標記 |
注意:ENUM/SET 修改成員需 ALTER TABLE 重建表,頻繁變動業務建議改用查找表(code 表)+ 外鍵。
utf8mb4:字符 1-4 字節,VARCHAR(65535) 理論上限受行長度 65532 字節限制,實際最大字符數 ≈ 21844。utf8 (utf8mb3):字符 1-3 字節,最大字符數 ≈ 21845。latin1:字符 1 字節,最大字符數 = 65532。類型選型核心三原則:精確匹配業務範圍、最小化存儲空間、避免隱式轉換。定期 PROCEDURE ANALYSE() 或 SELECT * FROM table PROCEDURE ANALYSE() 獲取優化建議。遷移類型需評估數據截斷風險、索引重建成本、應用層兼容性,建議低峰期配合 pt-online-schema-change 執行。