MySQL VARCHAR 與 CHAR 存儲差異與選型建議
核心差異
| 特性 | CHAR(n) | VARCHAR(n) |
| 長度 | 固定 | 可變 |
| 存儲 | 不足補空格,固定 n 字節 | 實際長度 + 1 字節(長度前綴),>255 用 2 字節 |
| 尾部空格 | 檢索時自動去除 | 保留 |
| 速度 | 快(固定長度易定位) | 稍慢 |
存儲示例
| 值 | CHAR(4) 存儲 | CHAR 佔用 | VARCHAR(4) 存儲 | VARCHAR 佔用 |
| '' | ' ' | 4 字節 | '' | 1 字節 |
| 'ab' | 'ab ' | 4 字節 | 'ab' | 3 字節 |
| 'abcd' | 'abcd' | 4 字節 | 'abcd' | 5 字節 |
| 'abcdefgh' | 'abcd' | 4 字節(截斷) | 'abcd' | 5 字節(截斷) |
檢索行為差異
CREATE TABLE test (a VARCHAR(4), b CHAR(4));
INSERT INTO test VALUES ('ab ', 'ab ');
SELECT CONCAT(a, '+'), CONCAT(b, '+') FROM test;
-- 結果:'ab +' vs 'ab+'
引擎選型建議
- MyISAM:傾向 CHAR(固定行格式,查找快)
- InnoDB:推薦 VARCHAR(行溢出機制、壓縮友好,節省空間)
業務場景選擇
- 長度固定(身份證、手機號、MD5):CHAR
- 長度不固定(地址、描述、姓名):VARCHAR
- 多語言/Emoji:NCHAR/NVARCHAR(Unicode)