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

全面認識 Oracle 字符集:查詢、修改與遷移實戰(第一部分)

     編輯:Oracle 資料庫基礎

什麼是 Oracle 字符集

字節資料解釋的符號集合,有大小與包容關係。NLS_LANG 參數控制語言、地域、字符集三要素:

NLS_LANG = LANGUAGE_TERRITORY.CHARSET
例:AMERICAN_AMERICA.ZHS16GBK

真正影響資料儲存的是第三部分(CHARSET)。兩庫 CHARSET 相同即可互導,前兩部分僅影響提示訊息語言。

查詢三類字符集

1. Server 端

SELECT USERENV('LANGUAGE') FROM DUAL;
-- 結果:AMERICAN_AMERICA.ZHS16GBK

2. 匯出檔 (DMP) 字符集

DMP 第 2、3 位元組記錄字符集 ID(十六進位)。小檔案用 UltraEdit 開啟;大檔案 (Unix):

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

3. Client 端

  • Windows:註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG
  • 臨時設定:SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (僅影響當前 CMD 視窗)
  • Unix:echo $NLS_LANG

三者不一致時,統一修改 Client 端與 Server 端一致。

修改字符集原則與風險

  • 理論上建庫後不可變更。
  • 官方僅支援「子集 → 超集」轉換(如 US7ASCII → ZHS16GBK),反向或無包容關係(如 ZHS16GBK ↔ ZHS16CGB231280)不支援。
  • 錯誤修改可能導致資料庫不可用,極不建議生產環境操作。

Server 端修改步驟(僅限子集→超集,極度謹慎)

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

DMP 檔字符集修改(較低風險,常用於遷移)

  1. 查詢目標字符集十六進位:SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'),'XXXX') FROM DUAL; → 0354
  2. 小檔:UltraEdit 直接修改第 2、3 位元組為 0354。
  3. 大檔:需程式修改(Java Stored Procedure 等,需資料庫安裝 JVM)。

修改 DMP 字符集僅「欺騙」匯入檢查,實際資料編碼未轉換,仍需確保來源與目標編碼相容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved