字節資料解釋的符號集合,有大小與包容關係。NLS_LANG 參數控制語言、地域、字符集三要素:
NLS_LANG = LANGUAGE_TERRITORY.CHARSET 例:AMERICAN_AMERICA.ZHS16GBK
真正影響資料儲存的是第三部分(CHARSET)。兩庫 CHARSET 相同即可互導,前兩部分僅影響提示訊息語言。
SELECT USERENV('LANGUAGE') FROM DUAL;
-- 結果:AMERICAN_AMERICA.ZHS16GBK
DMP 第 2、3 位元組記錄字符集 ID(十六進位)。小檔案用 UltraEdit 開啟;大檔案 (Unix):
cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6
-- 假設得 0354
SELECT NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX')) FROM DUAL; -- ZHS16GBK
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (僅影響當前 CMD 視窗)echo $NLS_LANG三者不一致時,統一修改 Client 端與 Server 端一致。
SQLPLUS /NOLOG CONN / AS SYSDBA SHUTDOWN IMMEDIATE STARTUP MOUNT ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET ZHS16GBK; ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK; SHUTDOWN IMMEDIATE STARTUP
SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'),'XXXX') FROM DUAL; → 0354修改 DMP 字符集僅「欺騙」匯入檢查,實際資料編碼未轉換,仍需確保來源與目標編碼相容。