欄位類型決定了儲存空間、數值範圍、精度、索引效能、查詢速度。選型失當會導致空間浪費、精度丟失、索引膨脹、甚至業務 Bug。本文系統梳理 MySQL 三大類型體系,提供實戰選型決策表。
| 類型 | 儲存 | 有號範圍 | 無號範圍 | 適用場景 |
|---|---|---|---|---|
TINYINT | 1 Byte | -128 ~ 127 | 0 ~ 255 | 狀態碼、布爾、極小計數 |
SMALLINT | 2 Bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 較小計數、年齡、短整數 |
MEDIUMINT | 3 Bytes | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、IP 整數存儲 |
INT / INTEGER | 4 Bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用 ID、計數器、自增主鍵首選 |
BIGINT | 8 Bytes | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 極大 ID、時間戳毫秒、大數據主鍵 |
關鍵點:
INT(11) 括號內數字僅為顯示寬度,不影響儲存範圍,8.0 已棄用顯示寬度語法。UNSIGNED 移除負數範圍,正數上限翻倍。自增主鍵建議加 UNSIGNED。BIT(M) 存儲位向量,M=1~64,較少用。| 類型 | 儲存 | 精度/範圍 | 適用場景 |
|---|---|---|---|
DECIMAL(M,D) / NUMERIC | M+2 或 D+2 Bytes | 精確定點,M 總位數,D 小數位。最大 65 位 | 金額、價格、比率、任何不能有誤差的數值 |
FLOAT | 4 Bytes | 單精度,~7 位有效數字,±3.4e38 | 科學計算、近似值、不需精確的測量數據 |
DOUBLE | 8 Bytes | 雙精度,~15 位有效數字,±1.7e308 | 高精度科學計算、GIS 座標 |
鐵律: 金額、價格、財務相關一律用 DECIMAL。FLOAT/DOUBLE 為二進制浮點,0.1 + 0.2 != 0.3,財務系統禁用。
| 類型 | 儲存 | 範圍 | 格式 | 特性與適用場景 |
|---|---|---|---|---|
DATE | 3 Bytes | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 純日期:生日、入職日、訂單日期 |
TIME | 3 Bytes | -838:59:59 ~ 838:59:59 | HH:MM:SS | 時間段、每日固定時間、持續時間 |
YEAR | 1 Byte | 1901 ~ 2155 (4位) | YYYY | 年份:出生年、統計年份 |
DATETIME | 8 Bytes | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 日期時間組合,無時區感知,應用層統一 UTC 存儲 |
TIMESTAMP | 4 Bytes | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | YYYY-MM-DD HH:MM:SS | 時區感知,寫入自動轉 UTC,讀取轉會話時區。2038 年問題限制長期應用 |
DATETIME(8 Bytes,無時區轉換開銷)。TIMESTAMP(4 Bytes,自動維護)。DATETIME 支援 DEFAULT CURRENT_TIMESTAMP、ON UPDATE CURRENT_TIMESTAMP,功能對齊 TIMESTAMP。| 類型 | 最大長度 | 儲存特性 | 適用場景 |
|---|---|---|---|
CHAR(N) | 255 字符 | 固定長度,不足右補空格,讀取時去除尾部空格(非 PAD_CHAR_TO_FULL_LENGTH 模式) | 定長代碼:MD5(32)、UUID(36)、國家代碼(2)、性別(1)、郵遞區號 |
VARCHAR(N) | 65,535 字符 (實際受行大小 65,535 限制) | 變長,1-2 Bytes 長度前綴 + 實際內容,不補空格 | 不定長文本:標題、姓名、郵箱、地址、JSON 片段 |
| 類型 | 最大長度 | 儲存 | 適用場景 |
|---|---|---|---|
TINYTEXT / TINYBLOB | 255 Bytes | 1 Byte 長度前綴 | 極短文本/二進制 |
TEXT / BLOB | 64 KB | 2 Bytes 長度前綴 | 文章內容、日誌、中等二進制 |
MEDIUMTEXT / MEDIUMBLOB | 16 MB | 3 Bytes 長度前綴 | 長文檔、圖片、大型 JSON |
LONGTEXT / LONGBLOB | 4 GB | 4 Bytes 長度前綴 | 超大文檔、視頻、備份數據 |
關鍵差異: TEXT 有字符集、校對規則,按字符比較;BLOB 無字符集,按字節比較。儲存圖片/檔案建議用檔案系統/對象存儲,資料庫只存路徑。
ENUM('a','b','c'):單選,最多 65,535 個元素,儲存為 1-2 Bytes 數字索引。修改元素需 ALTER TABLE,不靈活,建議改用查找表(TINYINT FK)。SET('a','b','c'):多選,最多 64 元素,儲存為位掩碼。同樣不建議用,改用關聯表或 JSON。| 業務需求 | 推薦類型 | 避坑提醒 |
|---|---|---|
| 自增主鍵 / 通用 ID | BIGINT UNSIGNED AUTO_INCREMENT | 預留未來擴展,避免 INT 耗盡 |
| 狀態碼 / 布爾 | TINYINT UNSIGNED | 不用 BOOL(同義 TINYINT(1)),明確語義 |
| 金額 / 價格 / 費率 | DECIMAL(19,4) 或 DECIMAL(10,2) | 嚴禁 FLOAT/DOUBLE |
| 創建/更新時間戳 | DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 8.0+ 推薦;舊版用 TIMESTAMP 或應用層維護 |
| 用戶輸入短文本(<255) | VARCHAR(255) | 實際業務長度設上限,別全開 65535 |
| 固定長度代碼 | CHAR(N) | N 確定時比 VARCHAR 省空間、索引快 |
| 大文本內容 | TEXT 或 LONGTEXT | 超大考慮拆表或外部存儲 |
| 二進制檔案 | 外部存儲(S3/OSS)+ 路徑 VARCHAR | 資料庫不存 BLOB,備份/複製/遷移極慢 |
資料類型是資料庫設計的基因。精準選型 = 省空間 + 快查詢 + 少 Bug。將「金額用 DECIMAL、時間用 DATETIME、主鍵用 BIGINT UNSIGNED、文本用 VARCHAR、大檔外部存」刻入肌肉記憶,每一次建表都精準落地。