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 檔第 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 字元集為目標值,繞過檢查。僅影響匯入端解譯,不改變實際位元內容,若實際編碼不符仍會產生亂碼。
避免直接修改生產庫字元集,風險不可控。