Oracle 字符集問題可歸納為三大類:資料庫字符集、客戶端字符集 (sqlplus等)、終端程序字符集 (非 Oracle)。三者不一致是導致中文亂碼的根本原因。
SELECT * FROM nls_database_parameters;
關鍵參數:NLS_CHARACTERSET(如 UTF8、ZHS16GBK、AL32UTF8)、NLS_LANGUAGE(顯示語言)。
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
注意:僅支援從子集向超集轉換 (如 US7ASCII → ZHS16GBK);ZHS16GBK 與 ZHS16CGB231280 無包含關係,互轉不受支援。
SELECT * FROM nls_instance_parameters; (來源:參數文件/環境變量/註冊表)SELECT * FROM nls_session_parameters; (來源:ALTER SESSION/會話環境變量)SELECT USERENV('LANGUAGE') FROM DUAL;ALTER SESSION > 環境變量 > 註冊表 > 參數文件
-- Windows CMD
SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
SET NLS_LANG=.ZHS16GBK -- 僅指定字符集,語言用預設
-- Unix/Linux (.profile 或 .bash_profile)
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
格式:語言_地區.字符集,字符集前的點號不可省略。
資料庫與客戶端字符集一致但仍亂碼,多因終端 (如 Bash、PuTTY、Windows CMD) 本身編碼不支援該字符集。Linux 下可用 locale 查看、export 設置終端編碼。