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

Oracle 匯出匯入字符集轉換規律全面剖析:避免資料損失與亂碼

     編輯:Oracle 資料庫基礎

四大關鍵字符集決定轉換行為

Exp/Imp 過程涉及四個字符集,任意不一致即觸發轉換:

  1. 源資料庫字符集 (Source DB Character Set)
  2. Export 用戶會話字符集 (Export Client NLS_LANG)
  3. Import 用戶會話字符集 (Import Client NLS_LANG)
  4. 目標資料庫字符集 (Target DB Character Set)

轉換流向與潛在資料損失

源DB字符集 → [Export轉換] → Export會話字符集 → (DMP檔案頭記錄Export會話字符集ID)
                                    ↓
                            [Import轉換] → Import會話字符集 → [Import轉換] → 目標DB字符集

典型損失場景

源DBExport會話結果
ZHS16GBK (超集)US7ASCII (7-bit)所有中文變 '??',資料永久損失
ZHS16GBKZHS16CGB231280 (子集)超出子集範圍的字變 '??'
ZHS16CGB231280ZHS16GBK完全轉換成功 (子集→超集安全)

確保零轉換 / 正確轉換的檢查清單

執行 Exp/Imp 前,確保以下四者**完全一致**:

源DB字符集 = Export會話字符集 = Import會話字符集 = 目標DB字符集

查詢資料庫字符集

-- SQL 查詢
SELECT VALUE$ FROM SYS.PROPS$ WHERE NAME = 'NLS_CHARACTERSET';
-- 或查看 init.ora 參數 NLS_CHARACTERSET

設定用戶會話字符集

  • Windows:登錄表 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_\NLS_LANG
  • Linux/Unix:環境變數 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

字符集修改流程 (極度謹慎,建議僅限空庫)

  1. 完整備份 (Exp,確保無字符集轉換)。
  2. 刪除所有用戶資料 (或 Drop Database 重建)。
  3. 以 Internal/SYS 修改系統表:
UPDATE SYS.PROPS$ SET VALUE$ = 'TARGET_CHARSET' WHERE NAME = 'NLS_CHARACTERSET';
COMMIT;
  1. 重啟資料庫。
  2. 還原資料 (Imp,確保字符集一致)。

可行轉換規律總結

  • 子集 → 超集:安全 (如 ZHS16CGB231280 → ZHS16GBK)。
  • 超集 → 子集:損失超出部分字符。
  • 純英文雙字節 → 單字節:安全 (如 ZHS16GBK[English Only] → US7ASCII)。
  • 同編碼範圍單字節集互轉:通常安全 (如 WE8ISO8859P1 ↔ US7ASCII 範圍內)。

字符集對應用程式的影響

類型代表中文字符長度SUBSTR 行為
單字節 7-bitUS7ASCII1漢字=2字符SUBSTR('東北大學',1,2)='東'
雙字節ZHS16GBK1漢字=1字符SUBSTR('東北大學',1,2)='東北'

選擇資料庫字符集四大原則

  1. 語言覆蓋:預留未來多語言擴展空間,優先選超集 (如 AL32UTF8 / ZHS16GBK)。
  2. OS/應用相容:避免客戶端/伺服器端轉換損失與效能損耗。
  3. 效能考量:單字節集效能優於多字節,空間佔用較小。
  4. 版本限制:參考對應版本文檔禁用字符集清單 (如 8.1.5 禁用 *_FIXED 系列)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved