數據泵導入成功的鐵律:源庫字符集 = 目標庫字符集 = DMP 文件字符集 = 客戶端 NLS_LANG 兼容。任一環節不匹配,必現亂碼或 ORA-12899/ORA-3113。
SELECT USERENV('language') FROM DUAL;
-- 輸出例:SIMPLIFIED CHINESE_CHINA.AL32UTF8
-- 格式:語言_地區.字符集
或查視圖:
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
Exp 導出的 DMP 文件第 2-3 字節存儲字符集 ID(16 進制)。
0354)。SELECT NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX')) FROM DUAL;
-- 返回例:ZHS16GBK
注意:僅適用傳統 Exp/Imp 產生的 DMP,Data Pump (expdp) 格式不同,需用 DBMS_METADATA 或 impdp SHOW=Y 獲取。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
-- 僅影響當前 CMD 窗口
| 環節 | 檢查點 | 異常處理 |
|---|---|---|
| 源庫 | NLS_CHARACTERSET | 若非 UTF8,評估遷移風險 |
| 目標庫 | 創建時指定 CHARACTER SET 保持一致 | 不一致則需重建庫或啟用字符集轉換 |
| DMP 文件 | 第 2-3 字節解析值 | 與源庫不符提示導出端 NLS_LANG 設置錯誤 |
| 導入客戶端 | NLS_LANG 與目標庫字符集兼容 | 設置為目標庫字符集或超集(如 AL32UTF8) |
NLS_LANG 只影響顯示,實則決定客戶端發送/接收字節流的編碼解碼邏輯。NLS_NCHAR_CHARACTERSET),導致 NCHAR 列數據截斷或報錯。