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

Oracle 字符集完整指南:查看、修改與三端一致性驗證

     編輯:Oracle 資料庫基礎

字符集架構與 NLS_LANG

Oracle 字符集定義位元組到字符的映射,分 資料庫端、客戶端、匯出檔 (DMP) 三端。核心參數 NLS_LANG 格式:

NLS_LANG = <語言>_<地域>.<字符集>
例:AMERICAN_AMERICA.ZHS16GBK

真正影響資料儲存/傳輸的是 第三部分 (字符集)。三端字符集第三部分必須一致,語言/地域僅影響訊息顯示。

三端字符集查看方法

1. 資料庫端 (Server)

-- 方法一:最直觀
SELECT userenv('language') FROM dual;
-- 回傳:AMERICAN_AMERICA.ZHS16GBK

-- 方法二:參數視圖 (建議)
SELECT parameter, value
FROM   nls_database_parameters
WHERE  parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

2. 客戶端 (Client)

  • Windows:登錄表 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_\NLS_LANG
  • Linux/Unix:環境變數 echo $NLS_LANG
  • Session 臨時覆蓋:ALTER SESSION SET NLS_LANG = 'AMERICAN_AMERICA.ZHS16GBK';

優先序:ALTER SESSION > 環境變數/註冊表 > 參數檔。

3. DMP 匯出檔

DMP 第 2、3 位元組記錄字符集 ID (16進位)。

  • 小檔案:UltraEdit 開啟 (16進位) 讀取位元組 → 查詢對應字符集。
  • 大檔案 (Linux):
cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6
-- 取得如 0354,再查詢:
SELECT nls_charset_name(TO_NUMBER('0354','XXXX')) FROM dual;
-- 回傳 ZHS16GBK

三端一致性驗證與修正

-- 完整檢查
SELECT 'DB' src, value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET'
UNION ALL
SELECT 'INSTANCE', value FROM nls_instance_parameters WHERE parameter='NLS_LANG'
UNION ALL
SELECT 'SESSION', value FROM nls_session_parameters WHERE parameter='NLS_LANG';
  • 若不一致 → 修改客戶端 NLS_LANG 使其字符集部分與資料庫端一致。
  • 語言部分建議統一用 AMERICAN_AMERICA 避免中文錯誤訊息編碼問題。

字符集修改 (資料庫端) — 高風險操作

  1. 完整備份 (RMAN + 匯出)。
  2. 關閉資料庫 → STARTUP MOUNT → ALTER SYSTEM ENABLE RESTRICTED SESSION → ALTER DATABASE CHARACTER SET INTERNAL_USE <新字符集> (僅限超集遷移,如 ZHS16GBK → AL32UTF8)。
  3. 非超集遷移需完整匯出/匯入或使用 CSALTER 腳本 (10g+),過程極其複雜,建議諮詢 Oracle 支援。

常見字符集對照

字符集說明適用場景
ZHS16GBK簡體中文雙位元組 (GBK)舊版中文系統
ZHT16BIG5繁體中文雙位元組 (Big5)繁體中文舊系統
AL32UTF8Unicode UTF-8 (含補充字符)新系統、多語言、Emoji、國際化首選
UTF8舊版 UTF-8 (不含補充字符)舊版多語言系統
WE8ISO8859P1西歐單位元組純英文/西歐語系
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved