CHAR 固定長度、VARCHAR 變動長度,兩者在儲存空間、處理速度、尾部空格處理上有本質差異。本文透過實測數據與官方文件深度解析,提供儲存引擎層面的選型建議。
| 特性 | CHAR(4) | VARCHAR(4) |
|---|---|---|
| 長度特性 | 固定 4 字元 | 變動長度 (1-4 字元) |
| 儲存空間 | 固定 4 bytes | 實際長度 + 1 byte (長度前綴) |
| 尾部空格 | 自動補齊空格 | 保留原始空格 |
| 讀取行為 | 移除尾部空格 | 保留尾部空格 |
| 超長截斷 | 靜默截斷 (非嚴格模式) | 靜默截斷 (非嚴格模式) |
| 輸入值 | CHAR 儲存 | CHAR 空間 | VARCHAR 儲存 | VARCHAR 空間 |
|---|---|---|---|---|
| '' (空字串) | ' ' | 4 bytes | '' | 1 byte |
| 'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
| 'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
| 'abcdefgh' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
CREATE TABLE test (a VARCHAR(4), b CHAR(4));
INSERT INTO test VALUES ('ab ', 'ab ');
SELECT CONCAT(a, '+'), CONCAT(b, '+') FROM test;
-- 結果: 'ab +' | 'ab+'
CHAR 讀取時自動移除尾部空格,VARCHAR 保留。
CHAR / NCHARVARCHAR / NVARCHARNCHAR / NVARCHAR (Unicode) 避免編碼轉換問題啟用 STRICT_TRANS_TABLES 時,超長資料會報錯而非靜默截斷,生產環境建議開啟嚴格模式保障資料完整性。