首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 字符集問題全景總結:查詢、修改、DMP 檔處理與遷移實戰

     編輯:Oracle 資料庫相關知識

一、什麼是 Oracle 字符集

字節資料解釋符號集合,有大小與包含關係。關鍵參數 NLS_LANG = LANGUAGE_TERRITORY.CHARSET(如 AMERICAN_AMERICA.ZHS16GBK),第三部分決定資料庫字符集。

二、三方字符集查詢方法

對象查詢方式
Server 端SELECT USERENV('LANGUAGE') FROM DUAL; 或 SELECT * FROM V$NLS_PARAMETERS
DMP 檔第 2-3 位元組為字符集 ID。小檔 UltraEdit 開啟;大檔 cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6 取十六進制,再 SELECT NLS_CHARSET_NAME(TO_NUMBER('xxxx','XXXX')) FROM DUAL 解析
Client 端Windows:註冊表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME...\NLS_LANG;Unix:echo $NLS_LANG 或 DOS SET NLS_LANG=...

導入導出要求三者一致。

三、字符集修改原則與操作

核心原則

  • 理論上僅支援「子集 → 超集」(如 US7ASCII → ZHS16GBK)。
  • ZHS16GBK 與 ZHS16CGB231280 無包含關係,理論不支援互轉(實務常強制但風險自負)。
  • AL32UTF8 基於 Unicode,涵蓋最廣,但佔用空間大。
  • 非萬不得已不建議修改 Server 字符集,錯誤修改導致不可預期後果。

Server 端修改標準流程(9i+)

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 檔字符集修改(低風險繞過檢查)

-- 查目標字符集十六進制
SELECT TO_CHAR(NLS_CHARSET_ID('ZHS16GBK'), 'XXXX') FROM DUAL;  -- 0354
-- UltraEdit 修改 DMP 第 2-3 位元組為 0354
-- 大檔案需寫程式(Java Stored Procedure 等)修改

四、遷移實戰建議

  1. 新建資料庫時直接指定目標字符集(CREATE DATABASE ... CHARACTER SET ZHS16GBK)。
  2. 跨字符集遷移:優先用 EXP/IMP 配合 DMP 字符集修改,或中間格式(CSV/Access)轉儲。
  3. Client 端統一設定與 Server 一致,避免顯示亂碼。
  4. 完整備份前提下再嘗試任何字符集變更操作。

小結

字符集問題核心在於「三方一致」與「子集→超集」原則。掌握 V$NLS_PARAMETERS 查詢、DMP 位元組修改、標準 ALTER DATABASE 流程,可應對 95% 字符集遷移與亂碼場景。

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