推薦 VARCHAR(30)。CHAR(30) 會右側填充空格至固定長度,存儲、索引、網絡傳輸均佔用 30 字節,浪費空間且 WHERE name = 'abc' 需注意尾部空格匹配(MySQL 默認 PAD_CHAR_TO_FULL_LENGTH 影響比較語義)。
| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 存儲 | 固定 n 字節,右填充空格 | 實際長度 + 1~2 字節長度前綴 |
| 索引大小 | 固定 n | 可變,通常更小 |
| 尾部空格 | 自動填充,比較時可能被忽略/保留 | 保留用戶輸入的空格 |
| 適用場景 | 固定長度代碼(MD5、UUID、郵編、身份證) | 變長文本(用戶名、郵箱、地址) |
可能觸發 ROW_SIZE_TOO_LARGE 或 INNODB_LIMIT,單行超過 8KB 或字段數超限。檢查表結構:
SHOW CREATE TABLE your_table;
-- 若有多個 CHAR(255) 或 TEXT/BLOB 導致行溢出,改為 VARCHAR 或調整頁面大小。
不會。MySQL 默認 sql_mode 不包含 PAD_CHAR_TO_FULL_LENGTH,CHAR 列比較時會忽略尾部空格。但為避免歧義,統一用 VARCHAR 並應用層 trim() 存儲。