Oracle 在中文顯示上常出現亂碼,核心原因在於字符集設置不當。字符集需在服務端安裝時指定 (存於 V$NLS_PARAMETERS),客戶端則視 sql*net 版本存於 Oracle.ini (2.0 以下) 或註冊表 (2.0 以上)。
| 場景 | 特徵 | 典型成因 |
|---|---|---|
| 1.1 服務端≠客戶端,但=載入數據 | 最常見 | 客戶端字符集未正確配置 |
| 1.2 服務端=客戶端,但≠載入數據 | 升級/遷移常見 | 新庫字符集與備份數據源不一致 |
| 1.3 服務端≠客戶端,且≠輸入數據 | 最棘手 | 不匹配環境下輸入的髒數據 |
SELECT * FROM V$NLS_PARAMETERS;HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\NLS_LANG = AMERICAN_AMERICA.US7ASCII (示例)三種路徑:
CREATE DATABASE CHARACTER SET US7ASCII; -- 報錯 ORA-01031 但實際已生效
-- 隨後 IMP 導入數據,再 SHUTDOWN/STARTUP 字符集自動復原
先統一字符集,再按特徵碼手工替換錯誤漢字,無通用自動化方案。
VARCHAR2/CHAR:按資料庫字符集存儲NVARCHAR2/NCHAR:按國家字符集 (NLS_NCHAR_CHARACTERSET) 存儲同一二進制串,不同字符集解析出完全不同字符,這就是字符集的本質作用——「以何種形式理解信息」。