字符集轉換的exp/imp試驗一
2024-07-21 02:34:05
供稿:網友
以前也看了一些關于字符集轉換的文章,但是實際使用的時候還是發生了問題,出現了亂碼,為了徹底搞清楚字符集問題,我決定做測試,用EXP/IMP工具在不同字符集之間互相轉換數據。
環境:兩臺測試PC機器,分稱A機器(192.168.1.5)和B機器(192.168.1.8)
兩臺機器的配置都是一致的,安裝WIN2000操作系統和Oracle8.1.7數據庫
計劃從A機器導出包含有中文的數據,然后倒入到B機器中。
測試計劃:
分別在兩臺機器上安裝兩個instance,這兩個instance又分別是中,英文字符集。
為了簡單起見,國家字符集和字符集設置都是一樣的,就是說,設置成英文字符集的時候,上面說的兩個設置都是US7ASCII,設置中文字符集的時候都是ZHS16GBK,我沒有考慮國家字符集和字符集不一致的情況。
客戶端也分成C,D兩個部分,實際測試的時候C和D是一個客戶端,因為假如A和C的字符集不一致,是不答應導出的;同樣,假如B和D的字符集不一致,是不答應導入的。
在C機器上建立四個服務指向上面新建的4個instance。
5c:中文 在A機器上
5e:英文 在A機器上
8c:中文 在B機器上
8e:英文 在B機器上
四個進程都建立相同的用戶和表。
Connect system/manager
Create user test identified by test default tablespace users temporary tablespace temp;
Grant connect,resource to test;
Connect test/test
Create table emp(id number(2) , address varchar2(100));
然后只在A機器上的兩個進程中插入數據。
Insert into emp(id,address) values(1,'北京市');
Insert into emp(id,address) values(2,'成都市');
Insert into emp(id,address) values(3,'上海市');
Insert into emp(id,address) values(4,'天津市');
Insert into emp(id,address) values(5,'重慶市');
Insert into emp(id,address) values(6,'武漢市');
Insert into emp(id,address) values(7,'廣州市');
Commit;
然后測試,過程如下
一:在C機器上測試,C機器是英文字符集
exp system/manager@5c file=c:5c1.dmp owner=test
exp system/manager@5e file=c:5e1.dmp owner=test
都導出成功。
發現上面兩個文件的ACSII字符集都是0001
二:在C機器上測試,C機器換成中文字符集
exp system/manager@5c file=c:5c2.dmp owner=test
exp system/manager@5e file=c:5e2.dmp owner=test
發現上面兩個文件的ACSII字符集都是0354
A機器上的數據庫變換字符集,就是把原來英文字符集數據庫換成中文字符集,把原來中文字符集數據庫換成英文字符集。
備注:之后沒有把原來的數據刪掉重新錄入中文數據,而是用以前的舊的數據。后來發現:原來英文字符集數據庫換成中文字符集后,數據可以正常顯示;反之,中文字符集數據庫換成英文字符集后,數據已經是亂碼了,已經不能正常顯示了。
原因:中文字符集占兩個字節,英文字符集占一個字節,所以當中文轉換成英文的時候,數據庫壓縮,數據就無法正常顯示了。反過來可以正常顯示,所以推薦建立數據庫的時候用英文字符集,好處多多(包括全文索引的時候)。
所以后來倒出的5c3.dmp和5c4.dmp實際上包含的數據都已經是不對的,測試已經沒有意義了。于是我重新進行試驗,在變換數據庫字符集后,刪掉原來的數據庫emp表中的數據,插入正確的數據,保證源數據庫中的數據是可用的。
重新測試。
然后把A機器上的數據庫變換字符集,就是原來是中文的數據庫我換成英文,原來是英文的數據庫我換成中文,采用的方法是修改PRops$表。
三:A機器上的數據庫變換字符集后。
C機器上導出操作,C機器是英文字符集
exp system/manager@5c file=c:5c3.dmp owner=test
exp system/manager@5e file=c:5e3.dmp owner=test
都導出成功。
發現上面兩個文件的ACSII字符集都是0001
四:A機器上的數據庫變換字符集后。
C機器上導出操作,C機器是中文字符集
exp system/manager@5c file=c:5c4.dmp owner=test
exp system/manager@5e file=c:5e4.dmp owner=test
都導出成功。
發現上面兩個文件的ACSII字符集都是0354
備份上面導出的8個數據文件。
這時候修改上面導出的8個文件的ACSII字符集,進行中英文互換,把0001和0354互換
修改后的文件名都加了一個"_2"標記
小結:
1. 導出的時候,假如客戶端和數據庫的字符集設置不一致,導出的時候Oracle并沒有提示。
2. 導出文件的ACSII字符集和客戶端的字符集設置有關,與被導數據庫字符集的設置無關。
****************************************
**** 導入操作 ****
****************************************
一:向B的8c倒入操作,客戶機D是英文字符集
1. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c1.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c1.dmp是英文客戶端導出的中文數據庫文件;ASCII字符集是英文的
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
2. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c1_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c1_2.dmp是英文客戶端導出的中文數據庫文件,ASCII字符集是改成中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
3. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c2.dmp是中文客戶端導出的中文數據庫文件,ASCII字符集是中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
4. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c2_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c2_2.dmp是中文客戶端導出的中文數據庫文件,但是ASCII字符集是改成英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
5. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c3.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c3.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,ASCII字符集是英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
6. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c3_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c3_2.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,但是ASCII字符集是改成中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
7. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c4.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c4.dmp是中文客戶端導出的英文數據庫文件;但是數據庫是換過的。
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
8. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c4_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c4_2.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的。
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
9. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e1.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e1.dmp是英文客戶端導出的英文數據庫文件
,ASCII字符集是英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
10. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e1_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e1_2.dmp是英文客戶端導出的英文數據庫文件,但是ASCII字符集是換成中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
11. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集侵形模?e2.dmp是中文客戶端導出的英文數據庫文件,ASCII字符集是中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
12. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e2_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e2_2.dmp是中文客戶端導出的英文數據庫文件,但是ASCII字符集是換成英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
13. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e3.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e3.dmp是英文客戶端導出的中文數據庫文件,但是數據庫是換過的,ASCII字符集是英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
14. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e3_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e3_2.dmp是英文客戶端導出的中文數據庫文件,但是數據庫是換過的,但是ASCII字符集是換成中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
15. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e4.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e4.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
16. D機器是英文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e4_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e4_2.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的,但是ASCII字符集是換成英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
小結:
1. 導入的時候,假如客戶端和數據庫的字符集設置不一致,導入的時候Oracle并沒有提示。
2. 導入的時候,假如客戶端和數據庫的字符集設置不一致,ORACLE不進行字符集驗證,最終結果是數據庫不可用。
3. 至于是亂碼還是問號,我沒有總結,因為沒有必要,反正是數據庫不可用。
4. 上面的操作其實沒有必要做,因為導入的客戶端和目的數據庫字符集不一致,導入后肯定不能用,但是為了試驗的完整性,我還是自己做了一遍,希望大家不要嫌煩
二:向B的8c倒入操作,客戶機是中文字符集
17. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c1.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c1.dmp是英文客戶端導出的中文數據庫文件;ASCII字符集是英文的
提示:不支持要求的字符集轉換,倒入失敗。
18. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c1_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c1_2.dmp是英文客戶端導出的中文數據庫文件,ASCII字符集是改成中文的;
導入成功,有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
19. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c2.dmp是中文客戶端導出的中文數據庫文件,ASCII字符集是中文的;
導入成功,有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
20. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c2_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c2_2.dmp是中文客戶端導出的中文數據庫文件,但是ASCII字符集是改成英文的;
提示:不支持要求的字符集轉換,倒入失敗。
21. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c3.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c3.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,ASCII字符集是英文的;
提示:不支持要求的字符集轉換,倒入失敗。
22. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c3_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c3_2.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,但是ASCII字符集是改成中文的;
導入成功,有報錯信息。
用英文字符集客戶端是???,問號;用中文客戶端是正確結果,可以看到中文。
實際上導入成功。
23. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c4.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c4.dmp是中文客戶端導出的英文數據庫文件;但是數據庫是換過的。ASCII字符集是中文的;
導入成功,有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
24. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5c4_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5c4_2.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的。ASCII字符集是換成英文的;
提示:不支持要求的字符集轉換,倒入失敗。
25. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e1.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e1.dmp是英文客戶端導出的英文數據庫文件,ASCII字符集是英文的;
提示:不支持要求的字符集轉換,倒入失敗。
26. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e1_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e1_2.dmp是英文客戶端導出的英文數據庫文件,但是ASCII字符集是換成中文的;
導入成功,有報錯信息。
用英文字符集客戶端是???,問號;用中文客戶端是正確結果,可以看到中文。
實際上導入成功。
27. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e2.dmp是中文客戶端導出的英文數據庫文件,ASCII字符集是中文的;
導入成功,有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
28. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e2_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e2_2.dmp是中文客戶端導出的英文數據庫文件,但是ASCII字符集是換成英文的;
提示:不支持要求的字符集轉換,倒入失敗。
29. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e3.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e3.dmp是英文客戶端導出的中文數據庫文件,但是數據庫是換過的,ASCII字符集是英文的;
提示:不支持要求的字符集轉換,倒入失敗。
30. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e3_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e3_2.dmp是英文客戶端導出的中文數據庫文件,但是數據庫是換過的,但是ASCII字符集是換成中文的;
導入成功,有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8C,數據庫是???(注重:問號不是亂碼),實際上導入失敗。
31. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e4.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e4.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的
導入成功,有報錯信息。
用英文字符集客戶端是???,問號;用中文客戶端是正確結果,可以看到中文。
實際上導入成功。
32. D機器是中文字符集,B機器是中文數據庫
imp system/manager@8c file=c:5e4_2.dmp fromuser=test touser=test ignore=y
8C數據庫字符集是中文,5e4_2.dmp是中文客戶端導出的中文數據庫文件,但是數據庫是換過的,但是ASCII字符集是換成英文的;
提示:不支持要求的字符集轉換,倒入失敗。
小結:
1:導入的時候,只有當客戶機和服務器的字符集一致的時候才進行倒入的字符集驗證,當導入文件(DMP文件)的ASCII字符集和他們一致的時候才能導入,否則報:不支持要求的字符集轉換。
2:必要條件是導出文件是可用的,就是說,導出的時候的客戶端和服務器端的字符集是一致的??梢越忉?6和31的成功。
3:26的成功說明了就算是英文的數據庫保存中文數據,在導出后修改DMP文件的字符集,還是可以導入到中文數據庫中的。
4:31的成功說明了就算數據庫是轉換過的,但是還是可以正確導出中文數據的。
5:22的成功說明了就算是英文的數據庫保存中文數據,在導出后修改DMP文件的字符集,還是可以導入到中文數據庫中的。(即使這個英文數據庫原來是中文的)
7:最不可理解的是19,為什么不行,按道理說,它應該是最有把握的。
三:向B的8e倒入操作(數據庫是英文數據庫),客戶機D是英文字符集
備注:客戶機是中文字符集的情況其實不用測試了,因為客戶機和服務器不一致,肯定出現問題。
33. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c1.dmp fromuser=test touser=test ignore=y
5c1.dmp是英文客戶端導出的中文數據庫文件;ASCII字符集是英文的
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8E,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
34. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c1_2.dmp fromuser=test touser=test ignore=y
5c1_2.dmp是英文客戶端導出的中文數據庫文件,ASCII字符集是改成中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8E,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
35. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c2.dmp fromuser=test touser=test ignore=y
5c2.dmp是中文客戶端導出的中文數據庫文件,ASCII字符集是中文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8E,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
36. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c2_2.dmp fromuser=test touser=test ignore=y
5c2_2.dmp是中文客戶端導出的中文數據庫文件,但是ASCII字符集是改成英文的;
導入成功,沒有報錯信息。
但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問8E,數據庫是亂碼(注重:亂碼不是問號),實際上導入失敗。
37. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c3.dmp fromuser=test touser=test ignore=y
5c3.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,ASCII字符集是英文的;
導入成功,沒有報錯信息。
用英文客戶端SQL/PLUS訪問8E,數據庫是中文,實際上導入成功。
38. D機器是英文字符集,B機器是英文數據庫
imp system/manager@8e file=c:5c3_2.dmp fromuser=test touser=test ignore=y
>5c3_2.dmp是英文客戶端導出的英文數據庫文件,但是數據庫是換過的,但是ASCII字符集是改成中文的;
導入成功,沒有報錯信息。
用英文客戶端SQL/PLUS訪問8E,數據庫是???,倒入不成功。