首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 字元集完整指南:查詢、修改、遷移與亂碼排查

     編輯:Oracle 資料庫基礎

字元集基礎概念

Oracle 字元集定義位元組資料的解讀方式,具備大小與包含關係 (子集 → 超集)。關鍵參數 NLS_LANG = LANGUAGE_TERRITORY.CHARSET 三部分分別控制訊息語言、日期/數字格式、字元集。**真正影響資料儲存與交換的是第三部分 CHARSET**。

三大字元集層級與查詢方法

層級查詢方式範例結果
資料庫伺服器端SELECT USERENV('LANGUAGE') FROM DUAL;AMERICAN_AMERICA.ZHS16GBK
用戶端環境Windows: 登錄表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME\NLS_LANG
Unix: echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
DMP 匯出檔小檔: UltraEdit 開啟十六進位看第 2-3 位元組 → SELECT NLS_CHARSET_NAME(TO_NUMBER('xxxx','XXXX')) FROM DUAL;
大檔: cat exp.dmp | od -x | head -1 | awk '{print $2$3}' | cut -c3-6 同前查詢
第 2-3 位元組 0354 → ZHS16GBK

字元集修改策略與風險

原則:僅支援子集 → 超集 轉換

  • US7ASCII ⊂ ZHS16GBK、UTF8 (最大,Unicode 基礎)
  • ZHS16GBK 與 ZHS16CGB231280 **無包含關係,理論不支援互轉**
  • 建立資料庫後字元集**理論不可變**,強行修改極高風險

伺服器端修改 (極不建議,僅限測試/空庫)

SQLPLUS /NOLOG
CONN / AS SYSDBA
SHUTDOWN IMMEDIATE
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

風險:Oracle 8+ 至少三張系統表記錄字元集,僅改 PROPS$ 不完整,可能導致資料字典損壞、啟動失敗。

DMP 檔字元集修改 (常用於匯入相容)

  • 原理:修改第 2-3 位元組「騙過」匯入檢查
  • 工具:UltraEdit (小檔) 或 Java Stored Procedure (大檔,需 JVM)
  • 目標碼查詢:SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'),'XXXX') FROM DUAL; → 0354
  • 適用:子集→超集、部分無關字元集實測可行 (US7ASCII, WE8ISO8859P1, ZHS16CGB231280, ZHS16GBK 互改常成功)

遷移最佳實務:字元集不同時的正確匯出入流程

  1. 來源庫字元集 = 目標庫字元集 (最理想)
  2. 若不同且符合子集→超集:直接 EXP/IMP 或 DATAPUMP,Oracle 自動轉碼
  3. 若無包含關係:
-- 方案 A: 以 UTF8 為中介 (通用超集)
-- 來源 (ZHS16GBK) → UTF8 中介庫 → 目標 (ZHS16CGB231280)
-- 方案 B: 程式碼層面轉碼 (Java/Python cx_Oracle) 逐筆讀寫
-- 方案 C: 建立目標字元集新庫,用 DB Link 或外部表搭配 CONVERT() 函數轉碼

常見亂碼場景與排查

現象原因對策
中文變 ??? 或 用戶端 NLS_LANG 與資料庫不符統一設定為資料庫字元集 (如 ZHS16GBK)
匯入後中文變亂碼DMP 字元集標記錯誤或匯入時字元集不匹配修正 DMP 標記或用 UTF8 中介庫
DB Link 查詢遠端中文亂碼兩端字元集不同且無隱含轉換遠端建立 UTF8 View 用 CONVERT(),本地查 View
JDBC 讀取中文亂碼JDBC Thin Driver 預設用 UTF-8,資料庫非 UTF8確認 oracle.jdbc.defaultNChar 或升級驅動/資料庫至 UTF8

快速檢查清單

  • [ ] 伺服器、用戶端、DMP 三方字元集一致
  • [ ] NLS_LANG 正確設定 (含語言、地區、字元集)
  • [ ] 遷移前用 CSALTER (僅限子集→超集) 或 UTF8 中介庫
  • [ ] 應用層連線屬性 (JDBC/ODBC/OLEDB) 字元集編碼一致
  • [ ] 定期備份字元集相關系統表 (PROPS$, NLS_DATABASE_PARAMETERS)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved