定義對比
| 類型 | 語法 | 長度單位 | 最大值 |
| VARCHAR2 | VARCHAR2(size) | **字節** | 4000 字節 |
| NVARCHAR2 | NVARCHAR2(size) | **字符**(按國家字符集) | 4000 字節上限,字符數視字符集而定 |
核心差異:中文存儲實測
場景:AL32UTF8 字符集(中文 3 字節)
| 定義 | 可存中文字符數 | 可存英文字符數 | 說明 |
| VARCHAR2(10) | 3 個(10÷3≈3) | 10 個 | 按字節計算 |
| NVARCHAR2(10) | 10 個 | 10 個 | 按字符計算,國家字符集通常為 AL16UTF16(定長 2 字節) |
原理深度
- VARCHAR2:長度語義永遠是 **Byte**,受數據庫字符集(NLS_CHARACTERSET)影響;
- NVARCHAR2:長度語義是 **Character**,受國家字符集(NLS_NCHAR_CHARACTERSET)影響,通常為 UTF16,定長 2 字節/字符,不受數據庫字符集變更影響;
- NVARCHAR2 存儲開銷固定(2 字節/字符),VARCHAR2 在 UTF8 下中文 3 字節、英文 1 字節,可變長度。
選型建議
- **多語言/國際化系統**:優先 NVARCHAR2,字符語義直觀,避免字節計算錯誤;
- **純 ASCII/英文為主**:VARCHAR2 更節省空間;
- **已有 VARCHAR2 表遷移**:評估數據截斷風險,NVARCHAR2(10) 實際佔 20 字節,可能超過行長度限制;
- **索引長度限制**:Oracle 單列索引鍵長度 ≤ 6398 字節,NVARCHAR2(3000) 即達 6000 字節,接近上限。
MySQL 對比補充
MySQL VARCHAR(N) 中的 N 為**字符數**(非字節),字符集決定實際字節上限(utf8mb4 單字符最多 4 字節,行長度 65535 字節)。這與 Oracle VARCHAR2 語義不同,遷移時需換算。