1. 程式人生 > >探索Oracle之 EXP/IMP過程中的字符集問題

探索Oracle之 EXP/IMP過程中的字符集問題

1. 問題描述:

       資料庫之間的資料遷移是一個很常見的作業,EXP/IMP工具是一個常用的資料遷移及轉化工具,因其匯出檔案具有平臺無關性,所以在跨平臺遷移中,最為常用。但在實際操作過程中,涉及到源資料庫,客戶端,目標資料庫三方面的字符集問題。操作人員對三者之間的字符集轉換過程不瞭解,而冒然使用EXP/IMP命令,往往在遷移過程中報錯終止,或是在沒有報錯的情況下成功匯入,但其背後卻存在隱患,在查詢時經常顯示亂碼。

2.解決方法

       2.1 源端資料庫(1)→EXP客戶端(2)→IMP客戶端(3)→目標資料庫(4),資料在遷移過程中要經歷如上的4個點,資料在流動過程中(如上的3個箭頭)需要依次比較箭頭兩端的字符集,如果相同則不轉換,如果不同則進行轉換。如果相鄰的兩個點之間設定的字符集均不相同,則需要轉換3次。

       根據上述理論分析,最好的設定方式是,因為(1)(4)資料庫的字符集是固定的,則設定客戶端的字符集(2)(3)均與(1)相同,這樣最多隻在(3)→(4)的過程中發生一次字符集的轉換。但是前提是(4)的字符集必須是(1)的的字符集的超集。客戶端字符集是通過環境變數NLS_LANG來設定。

Linux: export NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK
Windows: set NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK

      EXP匯出的檔案,可以通過WINDOWS上的工具UE來檢視,其中第一行的第2,3個位元組顯示的數字代表了檔案的字符集。
在sqlplus裡通過select nls_charset_name() from dual;可以檢視該數字代表的字符集。

03 03 54 45 58 50 4F 52 54 3A

其中,03 54是16進位制的數字,代表了一種字符集。將其轉換為10進製為:

SQL> select to_number('0354','xxxx') from dual;
TO_NUMBER('0354','XXXX')
------------------------
                     852
查詢852代表的字符集
SQL> select nls_charset_name(852) from dual;
NLS_CHAR
--------
ZHS16GBK

當然還可以逆向操作
SQL> select nls_charset_id('ZHS16GBK') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
                       852

       2.2 ORACLE在10g以後的版本中提供了新的遷移工具EXPDP/IMPDP,此工具無需設定客戶端字符集,而是由ORACLE自動去識別並完全字符集的轉換。這是因為EXPDP/IMPDP並不是完整意義上的客戶端,它和EXP/IMP/sqlplus並不完全一樣。它只是向oracle傳輸了一個命令,oracle在內部生成一個任務,檔案只能匯出在伺服器上,而不能像exp/imp一樣將檔案匯出到遠端端。但前提依然是,目標資料庫的字符集應是源資料庫字符集的超集。

其實,在使用exp/imp,expdp/impdp時,並不一定要嚴格要求目的資料庫是源資料庫的超集。問題的關鍵之處在於源端的字元能在目的端找到對應的字元。在不同字符集的資料庫傳輸之前,我們最好通過oracle提供的csscan工具來檢查兩個字符集之間是否可以轉換。


相關推薦

探索Oracle EXP/IMP過程字符集問題

1. 問題描述:        資料庫之間的資料遷移是一個很常見的作業,EXP/IMP工具是一個常用的資料遷移及轉化工具,因其匯出檔案具有平臺無關性,所以在跨平臺遷移中,最為常用。但在實際操作過程中,涉及到源資料庫,客戶端,目標資料庫三方面的字符集問題。操作人員對三者之

oracle備份exp/imp

測試環境:oracle 11g, redhat 5.5 純命令方式: exp der322/der322 owner=der322 file=wox1455.dmp log=wox1455.log buffer=6000000 Drop user der322 cascade; drop t

ADMT遷移:在遷移過程保留對源域資源的訪問權限

ADMT Sid History Sidhistory sid篩選 之前發表過使用ADMT進行域對象遷移的文章,連接如下:http://blog.51cto.com/hubuxcg/1554925http://blog.51cto.com/hubuxcg/1554927最近再次使用ADMT進行

Oracle存儲過程

cep oracle exceptio exc col rac TE 服務器 -s 存儲過程 1.基本的結構: create [or replace] procedure procedure_name[(參數1,參數2,,,)] as

安卓專案實戰Activity啟動過程動態獲取元件寬高的3種方式

前言 有時候我們需要在Activity啟動的時候獲取某一元件的寬或者是高用於動態的更改UI佈局,但是這時候我們直接通過getWidth和getHeight方法獲取是有問題的,如下: 我們在Activity的onCreate方法中呼叫如下的方法來獲取元件的寬高: /** * 在onC

HexoNexT配置過程遇到的問題

寫在前面 從搭建到佈置到GitHub花費時間大概用了五個小時,中間刪除repo N次,localhost執行正常,git上出現過404頁面、若干次README.md頁面,本文將簡略介紹搭建過程,主要內容是搭建過程中出現的問題解決方法。https://hexo.io/zh-cn/docs/ hexo官

工作練手玩蛇過程遇到的小技巧(4)

列表解析式生成字典 場景: 看Python資料時學到了一種通過列表解析式生成字典的方式,工作暫未用到過,先記錄下來。 程式碼: # 從 Python 2.7 開始,甚至可以用解析式生成字典(雜湊

工作練手玩蛇過程遇到的小技巧(5)

字典合併且累加值 場景: 兩個字典,key有一部分相同但value不同。現要把兩個字典合併,相同key的值累加。 程式碼: # 目的:將字典a中元素累加到字典n中 In [12]: a = {'

工作練手玩蛇過程遇到的小技巧(6)

字典索引在格式化字串中的引用 場景: 字典中有多個k:v需要格式化字串中引用時,有個比較方便的寫法 程式碼: # 有如下結構的字典 In [21]: a = { ...: 'data

Oracle使用exp,imp遷移資料庫(轉載)

1.從源資料庫匯出資料: 語法: exp user1/[email protected] file='E:test.dmp';1 示例: exp tianzhi_smart/[email protected]:1521/orcl file='E:\

Oracleexp/imp引數詳解

exp引數詳解 可在命令列介面輸入exp help=y獲取詳細說明: 引數名 預設值(格式) 說明 USERID username/password 指定要登陸使用者的

sql server在儲存過程利用OpenJson將Json字串轉化為表格

在Sql server2016的版本後,資料庫增加了對Json格式的支援,詳細資訊可以參考微軟官方文件連結 應用背景 線上訂餐系統中,購物車的內容儲存在瀏覽器快取中,所以資料庫關於訂單的設計是訂單表(訂單ID,送貨地址,使用者ID,,,,,),訂單明細表(訂

oracle中用exp,imp命令匯出dmp檔案時候存在@特殊符號

今天用exp導oracle的dmp檔案的時候發現密碼中存在@特殊字元。匯出失敗,不識別特殊符號。在網上查到了相應的解決方法,方法如下 資料庫的使用者名稱:scott 資料庫密碼:  [email

Oracle使用exp,imp遷移資料庫

1.從源資料庫匯出資料: 語法: exp user1/pwd1@test1 file='E:test.dmp'; 示例: exp tianzhi_smart/tianzhi_smart@19

oracle通過exp imp 匯出或匯入,指定表

指定表: exp test/oracle  file=/u01/b.dmp tables=mema.t1,mema.t3 imp user/password file=file.dmp TABLES=t1,T2; 全部: exp test/[email 

Oracle中用exp/imp命令快速匯入匯出資料

【用 exp 數 據 導 出】: 1 將資料庫TEST完全匯出,使用者名稱system 密碼manager 匯出到D:\daochu.dmp中    exp system/[email protected] file=d:\daochu.dmp full=y 2

ORACLE探索Oracle資料庫升級二

[[email protected] dbs]$ sqlplus /as sysdba SQL*Plus: Release 11.2.0.4.0Production on Sat Oct 4 04:11:22 2014 Copyright (c) 1982, 2013,Oracle. 

邏輯備份exp/imp

  exp/imp針對於邏輯結構,所以必須在資料庫open階段才能用,只是導資料,與物理檔案(datafile)沒有太大的關係,exp/imp操作的都是二進位制檔案,10g後還引進了expdp/impdp。exp/imp作用有:資料庫遷移、歷史資料歸檔、重新組織表(行遷移、

oracle ora-02020 儲存過程dblink使用個數問題

今天晚上加班,有個儲存過程,裡面已經有4個dblink了,但是由於業務需要,還需要再加幾個,在加到第五個的時候,系統忽然丟擲一個錯誤:ora-02020 too many database links in use。諮詢oracle工程師,得出的結論是在oracle的系統引數

Oracle dmp匯入/匯出、資料庫操作等過程字符集問題

開篇:因為要定位一個 關於dmp檔案匯入的亂碼問題, 於是乎我開始了漫長了 Oracle字符集搜尋之路,網上關於講解oracle字符集的文章多得數不勝數,但轉載的這篇文章確是我最最喜歡的,圖文並茂,恰當的例子通俗易懂,對於我這種小菜最最適合不過。 本文轉自:http:/