正確選擇字符類型對存儲效率、索引效能、應用邏輯正確性至關重要。本文系統梳理 MySQL 5.0+ 版本中 CHAR、VARCHAR、TEXT、BLOB 的存儲機制、長度限制、編碼影響、性能差異及選型建議。
VARCHAR(255) 最大 255 字節;5.0+ 最大長度擴展至 65,535 字節 (實際可存 65,532 字節,2 字節存長度,若超 255 則用 3 字節)。VARCHAR(20) 指 20 字節,UTF-8 漢字佔 3 字節,僅能存 6 個。VARCHAR(20) 指 20 字符,無論數字、字母、UTF-8 漢字均可存 20 個。TEXT 並產生 Warning。
ERROR 1118 (42000): Row size too large,需將大字段改為 TEXT/BLOB。| 特性 | CHAR(M) | VARCHAR(M) |
|---|---|---|
| 長度類型 | 固定長度 (0-255) | 可變長度 (0-65,535) |
| 存儲方式 | 右側空格填充至 M 字節 | 實際長度 + 1/2 字節長度前綴 |
| 檢索行為 | 尾部空格自動移除 | 尾部空格保留 (標準 SQL) |
| 索引效率 | 高 (固定長度利於 B+ 樹定位) | 略低 |
| 適用場景 | 長度固定/近似固定 (MD5、手機號、ISO 代碼、枚舉值) | 長度變動大、平均長度遠小於最大長度 |
空間換時間:定長 CHAR 適合極高頻讀寫、長度穩定的列;VARCHAR 節省空間,適合通用業務字段。
VARCHAR 必須指定長度 (M),TEXT 無需指定。VARCHAR 受行長 64KB 限制;TEXT 族最高 LONGTEXT 可達 4GB。VARCHAR 列數據直接存行中 (溢出則行外);TEXT/BLOB 永遠行外存儲,行內僅存 1-4 字節指針。CHAR/VARCHAR 可設 DEFAULT;TEXT/BLOB 不能 設默認值。BLOB 二進制比較 (大小寫敏感);TEXT 字符比較 (大小寫不敏感,取決於 Collation)。TINY/MEDIUM/LONG)。WHERE 過濾、JOIN、ORDER BY 的字符列 → 優先 VARCHAR + 索引;避免 TEXT 參與索引 (需指定前綴長度且效率低)。UNSIGNED 翻倍正向範圍;常用於主鍵、外鍵、狀態碼。CHAR > VARCHAR > TEXT (InnoDB 下差距縮小,但邏輯仍成立)。utf8mb4 + utf8mb4_general_ci (或 0900_ai_ci),預留 Emoji/生僻字空間。VARCHAR(255) 當萬金油;TEXT 存短字符串卻無法設默認值;CHAR 存長文本導致巨大空間浪費。