NLS_LANG = language_territory.charset
兩資料庫間導入導出,僅需 charset 相同;前兩項僅影響提示訊息語系。
資料遷移(exp/imp、Data Pump)需三端字元集一致:
不一致會導致亂碼或 IMP-00031 錯誤。
SELECT userenv('language') FROM dual;
-- 回傳:AMERICAN_AMERICA.ZHS16GBK
或查詢 NLS_DATABASE_PARAMETERS / V$NLS_PARAMETERS。
小檔案:UltraEdit 開啟十六進制,讀取位元組(如 0354)→ 轉換:
SELECT nls_charset_name(TO_NUMBER('0354','XXXX')) FROM dual;
-- 回傳:ZHS16GBK
大檔案(>2GB):Linux 指令擷取:
cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK(僅影響當前 CMD 視窗)echo $NLS_LANG 或 export NLS_LANG=...鐵律:資料庫建立後理論上不可變更字元集。設計階段務必選擇通用字元集(強烈建議 AL32UTF8)。
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;
Oracle 8+ 至少三張系統表記錄字元集,直接改 props$ 會導致資料庫損壞。
SELECT TO_CHAR(nls_charset_id('ZHS16GBK'),'XXXX') FROM dual; → 03540354。實測:US7ASCII、WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK 互改多半成功,但僅欺騙匯入檢查,資料實際編碼未變,若實際編碼不符仍會產生亂碼。
Character Set Scanner (csscan) 掃描風險資料。