首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 中文亂碼根因分析與三端字符集一致性實戰指南

     編輯:Oracle 資料庫相關知識

亂碼本質:三端字符集不一致導致錯誤轉換

Oracle 字符集同時存在於:

  • Server 端:建庫時指定,存於 V$NLS_PARAMETERS.NLS_CHARACTERSET
  • Client 端:由環境變量 NLS_LANG 決定(Windows 註冊表、Linux .bash_profile)
  • 資料本身:導入資料的原始編碼

鐵律:Client = Server = 資料編碼 才能正確顯示。

NLS_LANG 結構與設定

NLS_LANG = LANGUAGE_TERRITORY.CHARACTERSET
-- 例:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
-- 僅第三段 CHARACTERSET 影響資料轉換

Client 設定

  • Windows:註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG
  • Linux:export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 寫入 ~/.bash_profile

Server 查詢

SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
-- 關鍵看 NLS_CHARACTERSET

修改 Server 字符集:正規軍與偏門

⚠️ 官方鐵律

  • 建庫後**理論不可修改**
  • 僅支援 **子集 → 超集**(US7ASCII → ZHS16GBK → UTF8)
  • ZHS16GBK ↔ ZHS16CGB231280 **無包含關係,互不支援轉換**
  • 錯誤修改導致資料字典損壞、資料庫無法啟動

正規修改流程(極少用,慎用)

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;

Dump File 檔頭「偽裝」修改(救急專用)

-- 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 後**重新輸入資料**

SQL*Plus 亂碼快速修正

# 顯示英文介面
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
# 顯示中文介面
export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.ZHS16CGB231280

選型建議

  • 純中文環境:ZHS16GBK(涵蓋 GB2312,支援港台字)
  • 多語系/未來擴展:AL32UTF8(Oracle 推薦 UTF-8 實作)
  • 原則:資料庫字符集 = OS 本地字符集超集 = 所有 Client 字符集超集
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved