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

Oracle imp 導入備份資料:字元集不匹配解決實戰

     編輯:Oracle 資料庫基礎

問題場景

  • 來源:Oracle 9.0.1,字元集 JA16EUC (ID 830)
  • 目標:Windows Server 2000 中文版,字元集 ZHS16GBK (ID 852)
  • 錯誤:IMP-00016: 不支援要求的字元集轉換(從類型 830 到 852)

核心原理

DMP 檔案第 2、3 位元組儲存字元集 ID(十六進位)。修改這兩個位元組可「欺騙」匯入工具,繞過字元集檢查。

操作步驟

1. 確認 DMP 檔案字元集

-- 使用 UltraEdit 開啟 DMP(16進位模式),查看第 2、3 位元組
-- 假設為 03 2E(十六進位)

或用 SQL 驗證:

SELECT nls_charset_name(TO_NUMBER('032E', 'XXXX')) FROM dual;
-- 結果:JA16EUC

2. 取得目標字元集十六進位 ID

SELECT TO_CHAR(nls_charset_id('ZHS16GBK'), 'XXXX') FROM dual;
-- 結果:0354

3. 修改 DMP 檔案

  • 用 UltraEdit 開啟 DMP(16進位模式)
  • 將第 2、3 位元組從 03 2E 改為 03 54
  • 儲存檔案

4. 設定客戶端 NLS_LANG 並匯入

-- Windows 環境變數或註冊表
SET NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

-- 匯入
imp scott/tiger@SDES FULL=Y FILE=c:\expdat.dmp

關鍵 SQL 函數速查

函數用途範例
NLS_CHARSET_NAME(id)ID 轉字元集名稱NLS_CHARSET_NAME(830) → 'JA16EUC'
NLS_CHARSET_ID(name)名稱轉 IDNLS_CHARSET_ID('ZHS16GBK') → 852
TO_CHAR(id, 'XXXX')十進位轉十六進位TO_CHAR(852, 'XXXX') → '354'
TO_NUMBER(hex, 'XXXX')十六進位轉十進位TO_NUMBER('0354', 'XXXX') → 854

NLS_LANG 參數解析

NLS_LANG = LANGUAGE_TERRITORY.CHARSET
三個組成部分:
  LANGUAGE  - 伺服器訊息語言
  TERRITORY - 日期/數字格式
  CHARSET   - 字元集(最關鍵)

範例:AMERICAN_AMERICA.ZHS16GBK

查詢目前會話字元集

SELECT userenv('language') FROM dual;
-- 結果範例:SIMPLIFIED CHINESE_CHINA.UTF8

注意事項與限制

  • 理論上僅支援「子集→超集」轉換,實測常用字元集(US7ASCII、WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK)多可互改
  • 修改 DMP 字元集僅影響匯入檢查,資料實際編碼未變,若資料含目標字元集無法表示的字元會導致資料損壞
  • 匯入前若目標表已存在會失敗,需先刪除或使用 IGNORE=Y
  • 大型 DMP 檔建議使用 impdp (Data Pump) 並指定 TRANSFORM=SEGMENT_ATTRIBUTES:N 等參數

進階:Data Pump 匯入字元集處理

impdp system/password DIRECTORY=dpump_dir DUMPFILE=expdat.dmp
      TABLE_EXISTS_ACTION=REPLACE

Data Pump 會自動處理字元集轉換,支援更多字元集組合,為現代環境首選工具。

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