字符集設定不當是 Oracle 中文顯示亂碼的核心原因。本文系統分析三類常見錯誤場景,提供針對性解決方案。
ZHS16CGB231280、ZHS16GBK、US7ASCII、WE8ISO8859P1、AL32UTF8。NLS_LANG = LANGUAGE_TERRITORY.CHARSET(如 AMERICAN_AMERICA.ZHS16GBK)。| 場景 | 特徵 | 解決方案 |
|---|---|---|
| 1. Server/Client 字符集不一致,資料編碼正確 | 最常見。資料庫內碼正確,Client 顯示亂碼 | 修正 Client 字符集與 Server 一致: • sql*net 2.0-:編輯 oracle.ini• sql*net 32-bit:修改註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG |
| 2. Server 字符集與資料編碼不一致 | 升級/遷移/跨庫匯入導致。無論 Client 如何設定均亂碼 | 三種方案: 1) 重裝 Oracle 選擇正確字符集(限空庫) 2) 強制修改 Server 字符集: STARTUP MOUNT;3) 中間格式轉儲:匯出 → FoxBase/Access → 匯入(繞過字符集檢查) |
| 3. Client/Server 皆錯誤下輸入資料 | 雙方字符集不一致時輸入中文,資料實際編碼已錯 | 無完美方案。需先統一字符集,再依特徵碼人工替換修正。 |
-- 查詢
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
-- 或
SELECT USERENV('LANGUAGE') FROM DUAL;
-- 修改(謹慎,需子集→超集關係)
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK;
SHUTDOWN IMMEDIATE;
STARTUP;
DMP 第 2-3 位元組記錄字符集 ID。用 UltraEdit 修改或大檔案用程式處理:
-- 查詢目標字符集 16 進制代碼
SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'), 'XXXX') FROM DUAL; -- 回傳 0354
-- 將 DMP 第 2-3 位元組改為 0354
字符集規劃應在安裝前完成。遷移時優先統一 Server/Client,資料編碼不符時謹慎評估「子集→超集」關係,不可逆操作前必須完整備份。