字符型佔數據庫 80%+,正確選型關鍵。本文從 MyISAM/InnoDB 存儲差異、長度分布、碎片、內存臨時表影響四個維度深度解析,給出四條具體選型原則。
| 特性 | CHAR(N) | VARCHAR(N) |
|---|---|---|
| 長度 | 固定 N 字符 | 可變 0~N 字符 |
| 實際存儲 | 固定 N 字節(不足右填充空格,讀取時去尾空格) | 實際長度 + 1~2 字節長度前綴 |
| 更新導致行長度變化 | 否 | 是(可能產生碎片、行遷移) |
| 內存臨時表/排序 | 固定分配 N 字節 | 固定分配 N 字節(按定義長度而非實際長度) |
VARCHAR(1) 需 1 字節長度前綴,反而比 CHAR(1) 佔更多空間。VARCHAR(200) 存 10 字符,磁碟省但內存臨時表/排序按 200 字節分配,嚴重拖慢 ORDER BY、GROUP BY、UNION 使用臨時表的查詢。定義長度 = 業務最大長度 + 10% 冗餘。OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 整理。innodb_fill_factor (默認 100) 可預留空間減少分裂。