Oracle 字符集轉換發生在客戶端 OCI 庫 (普通字符串);NCHAR/NVARCHAR2 經歷客戶端→服務端雙重轉換。
NLS_CHARACTERSET = ZHS16GBK,NLS_NCHAR_CHARACTERSET = AL16UTF16NLS_LANG → 默認取 OS 字符集 (此處同為 ZHS16GBK)INSERT INTO t1 VALUES ('中');
-- 網絡包抓包 (TCP payload)
... 27 D6 D0 27 ... -- 0xD6D0 = '中' 的 GBK 編碼
客戶端直接發送 GBK 字節,服務端識別為 GBK → 存儲正確。
SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
INSERT INTO t1 VALUES ('中');
-- 網絡包
... 27 3F 3F 27 ... -- 0x3F3F = '??' (US7ASCII 無法表示雙字節)
OCI 認為客戶端編碼為 US7ASCII,將輸入字節按單字節處理,'中' (D6 D0) 非法 → 替換為 3F (?) → 入庫變「??」。
SET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
INSERT INTO t1 VALUES ('中');
-- 網絡包: 發送 D6 D0 (GB2312中'中'同碼)
-- 服務端按 GBK 接收 → 正確 (GB2312⊂GBK)
NLS_LANG=.AL32UTF8 (語言/地域可省略)。export LANG=zh_CN.UTF-8 + export NLS_LANG=.AL32UTF8。chcp 65001 + 設置註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_...\NLS_LANG = .AL32UTF8。oracle.jdbc.defaultNChar=true 正確處理 NCHAR。