| 特性 | NVARCHAR(n) | VARCHAR(n) |
|---|---|---|
| 儲存編碼 | Unicode (UCS-2/UTF-16),雙位元組 | 非 Unicode,單位元組 (視字碼頁) |
| 字元範圍 | 1 ~ 4,000 字元 | 1 ~ 8,000 位元組 |
| 儲存大小 | 實際字元數 × 2 位元組 | 實際位元組長度(含雙位元組字元為 2 位元組) |
| 支援語系 | 全球所有語言(中、日、韓、表情符號等) | 僅支援指定字碼頁語系(預設中文環境為 CP936/CP950) |
| 排序規則 | Unicode 排序規則 | 字碼頁相依排序規則 |
NVARCHAR:按字元儲存,每字元固定 2 位元組(增補字元除外)。VARCHAR:按位元組儲存,英文 1 位元組,中文 2 位元組(DBCS)。純 ASCII/英文資料:VARCHAR 節省 50% 空間。
含中文/多語系:兩者相近,但 NVARCHAR 避免字碼頁轉換錯誤。
VARCHAR:跨字碼頁移轉(如簡體 CP936 → 繁體 CP950)極易產生亂碼。NVARCHAR:Unicode 統一碼位,移轉零風險。VARCHAR 可存更多字元
CREATE TABLE TestChar (
Vcol VARCHAR(10),
Ncol NVARCHAR(10)
);
INSERT INTO TestChar VALUES ('ABC', N'ABC'); -- 3 位元組 vs 6 位元組
INSERT INTO TestChar VALUES ('中文', N'中文'); -- 4 位元組 vs 4 位元組 (雙位元組字元)
INSERT INTO TestChar VALUES ('A中', N'A中'); -- 3 位元組 vs 6 位元組
SELECT
Vcol, DATALENGTH(Vcol) AS V_Bytes,
Ncol, DATALENGTH(Ncol) AS N_Bytes
FROM TestChar;
SQL Server 2005+ 建議新專案預設使用 NVARCHAR(或 NVARCHAR(MAX)),儲存成本已非瓶頸,Unicode 相容性收益遠大於空間差異。舊系統若確定永不跨語系,可維持 VARCHAR。