| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 儲存方式 | 固定長度 n 字元 | 實際長度 + 2 位元組長度前綴 |
| 資料短於 n | 右側填補空白 | 不填補,僅存實際資料 |
| 資料長於 n | 截斷 | 截斷 |
| 搜尋效能 | 固定位移,略快 | 需讀取長度前綴,微慢 |
| 儲存空間 | 固定 n 位元組 | 實際長度 + 2 bytes |
若資料表**至少有一個 VARCHAR 欄位**,SQL Server 會將該表**所有 CHAR 欄位視為 VARCHAR 處理** (內部儲存格式轉為變長)。此為舊版相容行為,現代版本仍保留。
CHAR (如 ISO 代碼、性別旗標、狀態碼)。VARCHAR (如備註、描述、JSON 片段)。NCHAR/NVARCHAR。VARCHAR(MAX)/NVARCHAR(MAX) (取代舊 TEXT/NTEXT)。CHAR(10) vs VARCHAR(10) 存 5 字元,查詢效能差異 < 1%,空間差異 2 倍。-- 將 CHAR 改為 VARCHAR (資料不截斷)
ALTER TABLE T ALTER COLUMN C VARCHAR(20);
-- 若有索引需重建
總結:**預設用 VARCHAR**,僅在明確需要固定長度優勢 (極短、高頻、固定格式) 時選 CHAR。