當使用 PL/SQL Developer 連線新安裝的 Oracle 資料庫時,若出現 ORA-01460: unimplemented or unreasonable conversion requested 錯誤,通常是用戶端與伺服器端字符集不匹配導致。本文記錄實戰排查過程與解決方案。
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
ZHS16CGB231280 (簡體中文 GB2312)ZHS32GB18030 (GB18030 超集,支援更多漢字)-- 停庫、掛載、限制模式
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
-- 嘗試修改為 ZHS16CGB231280 (報錯:只允許修改到超集)
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET ZHS16CGB231280; -- ORA-12712: new character set must be a superset of old character set
因為 ZHS16CGB231280 不是 ZHS32GB18030 的超集,無法直接降級。
在客戶端機器設定環境變數或註冊表,使其與資料庫字符集一致:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<你的Home名>\NLS_LANGSIMPLIFIED CHINESE_CHINA.ZHS32GB18030SET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS32GB18030EXPDP)CHARACTER SET ZHS16CGB231280IMPDP)新版本 (10.0 以上) 對 GB18030 支援更完善,可直接解決相容性問題。
LANGUAGE_TERRITORY.CHARACTERSET,其中 CHARACTERSET 必須與資料庫一致才能正確顯示非 ASCII 字元。SELECT * FROM V$NLS_PARAMETERS; -- 會話層級
SELECT * FROM NLS_INSTANCE_PARAMETERS; -- 實例層級 (參數檔/環境變數)
SELECT * FROM NLS_DATABASE_PARAMETERS; -- 資料庫層級
ORA-01460 在此場景下純屬用戶端字符集設定錯誤,調整客戶端 NLS_LANG 為 ZHS32GB18030 即可立即解決,無需動資料庫。建議開發團隊統一規範 NLS_LANG 設定,避免類似問題重複發生。