Oracle 兩大變長字串類型 VARCHAR2 與 NVARCHAR2 在字元語意、最大長度、字元集相依性上有本質差異。本文引用官方文件定義,配合 UTF8 字元集實測,釐清選型關鍵。
| 特性 | VARCHAR2(size [BYTE|CHAR]) | NVARCHAR2(size) |
|---|---|---|
| 長度單位 | 可指定 BYTE 或 CHAR | 固定為字元數 |
| 最大長度 | 4000 位元組或字元 | 4000 位元組(受國家字元集限制) |
| 字元集 | 資料庫字元集 | 國家字元集(AL16UTF16/UTF8) |
| 儲存編碼 | 資料庫字元集編碼 | 國家字元集編碼 |
-- VARCHAR2(6 CHAR) 以字元計長
CREATE TABLE t_varchar2(name VARCHAR2(6 CHAR));
INSERT INTO t_varchar2 VALUES('中國'); -- 2 字元,成功
INSERT INTO t_varchar2 VALUES('中華人民共和'); -- 6 字元,成功
INSERT INTO t_varchar2 VALUES('中華人民共和國'); -- 7 字元,失敗 ORA-12899
-- NVARCHAR2(6) 以字元計長
CREATE TABLE t_nvarchar2(name NVARCHAR2(6));
INSERT INTO t_nvarchar2 VALUES('中國'); -- 成功
INSERT INTO t_nvarchar2 VALUES('中華人民共和'); -- 成功
INSERT INTO t_nvarchar2 VALUES('中華人民共和國'); -- 失敗 ORA-12899
-- 最大長度差異
CREATE TABLE t_varchar2_max(name VARCHAR2(4000 CHAR)); -- 成功
CREATE TABLE t_nvarchar2_max(name NVARCHAR2(4000)); -- 失敗 ORA-00910
NVARCHAR2(size) ≈ VARCHAR2(size CHAR),皆以字元為單位VARCHAR2(4000 CHAR):最多 4000 字元NVARCHAR2(4000):受 4000 位元組上限限制,UTF8 環境下最多約 1333 字元(實測 2000 字元為上限)NVARCHAR2 綁定國家字元集(NLS_NCHAR_CHARACTERSET),跨資料庫遷移需注意VARCHAR2 避免隱性轉換;多語言混存、需統一 Unicode 處理時考慮 NVARCHAR2| 場景 | 建議類型 | 理由 |
|---|---|---|
| 純 ASCII/單一語系 | VARCHAR2(n CHAR) | 效能最佳,無編碼轉換 |
| 多語言混存、需 Unicode | NVARCHAR2(n) | 統一 UTF-16/UTF-8 儲存 |
| 需超過 2000 字元 | VARCHAR2(n CHAR) | NVARCHAR2 受 4000 位元組硬限制 |
| 既有表為 NVARCHAR2 | 維持原狀 | 避免遷移成本與風險 |
理解字元語意與位元組上限的本質差異,才能為資料模型做正確選型。