NLS_LANG 轉換為資料庫字符集,再傳給 Server。NLS_LANG 轉為資料庫字符集,Server 再按 NLS_NCHAR_CHARACTERSET 轉為國家字符集。| 客戶端 NLS_LANG | 插入 '中' | 網絡包編碼 | 結果 |
|---|---|---|---|
| 未設定 (預設 ZHS16GBK) | INSERT '中' | D6 D0 (GBK) | 正確 |
| AMERICAN_AMERICA.US7ASCII | INSERT '中' | 3F 3F (??) | 亂碼:US7ASCII 無法表達中文 |
| SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280 | INSERT '中' | D6 D0 | 正常 (GBK/GB2312 相容) |
| 同上 | INSERT '喫' (生僻字) | ORA-01756 | 客戶端轉換失敗,誤判引號結束 |
資料庫 US7ASCII / 國家字符集 AL16UTF16,客戶端 US7ASCII 插入 '中':
VP 而非 中。結論:資料庫字符集若為單字節集,國家字符集轉換極易出錯,建議資料庫字符集採用多字節集 (如 AL32UTF8/ZHS16GBK)。
NLS_LANG (普通列) 與 NLS_NCHAR (國家列) 決定是否轉換。NLS_NCHAR 時預設等於 NLS_LANG 字符集部分。現象:資料正常,但表/列註釋、中文列名、PL/SQL 內中文變亂碼。
原因:DMP 檔案內部結構中,DDL 與註釋以 NLS_LANG 指定字符集寫入,若匯出/匯入端 NLS_LANG 不一致,導致這部分解碼錯誤,而資料區塊因標記了字符集 ID 可正確轉換。
對策:匯出匯入雙端統一 NLS_LANG 為資料庫字符集 (如 ZHS16GBK),或使用 Data Pump (expdp/impdp) 避免客戶端轉換層。