Oracle 字符集同時存在於:
V$NLS_PARAMETERS.NLS_CHARACTERSETNLS_LANG 決定(Windows 註冊表、Linux .bash_profile)鐵律:Client = Server = 資料編碼 才能正確顯示。
NLS_LANG = LANGUAGE_TERRITORY.CHARACTERSET
-- 例:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
-- 僅第三段 CHARACTERSET 影響資料轉換
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANGexport NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 寫入 ~/.bash_profileSELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
-- 關鍵看 NLS_CHARACTERSET
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;
-- 1. 查目標字符集 ID
SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'), 'XXXX') FROM DUAL; -- 0354
-- 2. 小檔:UltraEdit 16進制改第 2-3 字節為 0354
-- 3. 大檔:需程式修改檔頭(Java Stored Procedure / Python),要求資料庫安裝 JVM
| 場景 | 成因 | 解決 |
|---|---|---|
| Client 亂碼,Server/資料正確 | Client NLS_LANG ≠ Server | 修正 Client NLS_LANG 與 Server 一致 |
| 導入後亂碼,Client/Server 一致 | Dump File 編碼 ≠ Server | 1) 修正 Dump 檔頭(子集→超集) 2) 或重建目標庫字符集一致後再導入 3) 或用文本/第三方工具中轉 |
| 輸入中文存入後查詢亂碼 | 輸入時 Client ≠ Server | 統一 Client/Server 後**重新輸入資料** |
# 顯示英文介面
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
# 顯示中文介面
export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.ZHS16CGB231280