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

Oracle 字元集修改實戰:Server 端與 DMP 檔兩種修法與風險控制

     編輯:Oracle 資料庫基礎

核心原則

  • 字元集具子集→超集包容關係(如 US7ASCII ⊂ ZHS16GBK ⊂ AL32UTF8),僅支援子集轉超集,反向或無包容關係(如 ZHS16GBK ↔ ZHS16CGB231280)官方不支援,強行修改恐導致資料損壞。
  • 建庫後理論上不可變更 Server 字元集,除非萬不得已且確認包容關係。

方法一:修改 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; -- NCHAR 字元集
SHUTDOWN IMMEDIATE
STARTUP

常見錯誤:ORA-12717(存在 NCLOB 資料無法變更 NCHAR)。解法:

ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;

INTERNAL_USE 關鍵字可繞過檢查,但極度危險,僅限測試環境或已完整備份且可接受資料遺失時使用。

方法二:修改 DMP 檔字元集(低風險,常用於匯入相容)

DMP 檔第 2-3 位元組儲存字元集 ID(16 進位)。查詢目標字元集 ID:

SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'),'XXXX') FROM DUAL;  -- 回傳 0354

用 UltraEdit 開啟 DMP(小檔),將第 2-3 位元組改為 0354。大檔(>2GB)用程式修改:

-- Python 範例
with open('exp.dmp','r+b') as f:
    f.seek(1)
    f.write(bytes.fromhex('0354'))

修改後 imp 會誤以為 DMP 字元集為目標值,繞過檢查。僅影響匯入端解譯,不改變實際位元內容,若實際編碼不符仍會產生亂碼。

建議流程

  1. 新建目標字元集資料庫(如 AL32UTF8)。
  2. 用 Data Pump 匯出(支援字元集轉換)。
  3. 匯入新庫,驗證資料完整性。

避免直接修改生產庫字元集,風險不可控。

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