熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

字符集轉換的exp/imp試驗一

2022-06-13   來源: Oracle 

  以前也看了一些關於字符集轉換的文章但是實際使用的時候還是發生了問題出現了亂碼為了徹底搞清楚字符集問題我決定做測試用EXP/IMP工具在不同字符集之間互相轉換數據
  
  環境兩台測試PC機器分稱A機器()和B機器()
  
  兩台機器的配置都是一致的安裝WIN操作系統和Oracle數據庫
  
  計劃從A機器導出包含有中文的數據然後倒入到B機器中
  
  測試計劃
  
  分別在兩台機器上安裝兩個instance這兩個instance又分別是中英文字符集
  
  為了簡單起見國家字符集和字符集設置都是一樣的就是說設置成英文字符集的時候上面說的兩個設置都是USASCII設置中文字符集的時候都是ZHSGBK我沒有考慮國家字符集和字符集不一致的情況
  
  客戶端也分成CD兩個部分實際測試的時候C和D是一個客戶端因為如果A和C的字符集不一致是不允許導出的同樣如果B和D的字符集不一致是不允許導入的
  
  在C機器上建立四個服務指向上面新建的個instance
  
  c中文 在A機器上
  
  e英文 在A機器上
  
  c中文 在B機器上
  
  e英文 在B機器上
  
  四個進程都建立相同的用戶和表
  
  Connect system/manager
  
  Create user test identified by test default tablespace users temporary tablespace temp;
  
  Grant connectresource to test;
  
  Connect test/test
  
  Create table emp(id number() address varchar());
  
  然後只在A機器上的兩個進程中插入數據
  
  Insert into emp(idaddress) values(北京市);
  
  Insert into emp(idaddress) values(成都市);
  
  Insert into emp(idaddress) values(上海市);
  
  Insert into emp(idaddress) values(天津市);
  
  Insert into emp(idaddress) values(重慶市);
  
  Insert into emp(idaddress) values(武漢市);
  
  Insert into emp(idaddress) values(廣州市);
  
  Commit;
  
  然後測試過程如下
  
  在C機器上測試C機器是英文字符集
  
  exp system/manager@c file=c:cdmp owner=test
  
  exp system/manager@e file=c:edmp owner=test
  
  都導出成功
  
  發現上面兩個文件的ACSII字符集都是
  
  在C機器上測試C機器換成中文字符集
  
  exp system/manager@c file=c:cdmp owner=test
  
  exp system/manager@e file=c:edmp owner=test
  
  發現上面兩個文件的ACSII字符集都是
  
  A機器上的數據庫變換字符集就是把原來英文字符集數據庫換成中文字符集把原來中文字符集數據庫換成英文字符集
  
  備注之後沒有把原來的數據刪掉重新錄入中文數據而是用以前的舊的數據後來發現原來英文字符集數據庫換成中文字符集後數據可以正常顯示反之中文字符集數據庫換成英文字符集後數據已經是亂碼了已經不能正常顯示了
  
  原因中文字符集占兩個字節英文字符集占一個字節所以當中文轉換成英文的時候數據庫壓縮數據就無法正常顯示了反過來可以正常顯示所以推薦建立數據庫的時候用英文字符集好處多多(包括全文索引的時候)
  
  所以後來倒出的cdmp和cdmp實際上包含的數據都已經是不對的測試已經沒有意義了於是我重新進行試驗在變換數據庫字符集後刪掉原來的數據庫emp表中的數據插入正確的數據保證源數據庫中的數據是可用的重新測試
  
  然後把A機器上的數據庫變換字符集就是原來是中文的數據庫我換成英文原來是英文的數據庫我換成中文采用的方法是修改props$表
  
  A機器上的數據庫變換字符集後
  
  C機器上導出操作C機器是英文字符集
  
  exp system/manager@c file=c:cdmp owner=test
  
  exp system/manager@e file=c:edmp owner=test
  
  都導出成功
  
  發現上面兩個文件的ACSII字符集都是
  
  A機器上的數據庫變換字符集後
  
  C機器上導出操作C機器是中文字符集
  
  exp system/manager@c file=c:cdmp owner=test
  
  exp system/manager@e file=c:edmp owner=test
  
  都導出成功
  
  發現上面兩個文件的ACSII字符集都是
  
  備份上面導出的個數據文件
  
  這時候修改上面導出的個文件的ACSII字符集進行中英文互換互換
  
  修改後的文件名都加了一個_標記
  
  小結
  
   導出的時候如果客戶端和數據庫的字符集設置不一致導出的時候Oracle並沒有提示
  
   導出文件的ACSII字符集和客戶端的字符集設置有關與被導數據庫字符集的設置無關
  
  ****************************************
  
  **** 導入操作 ****
  
  ****************************************
  
  向B的c倒入操作客戶機D是英文字符集
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是英文客戶端導出的中文數據庫文件ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是英文客戶端導出的中文數據庫文件ASCII字符集是改成中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是中文客戶端導出的中文數據庫文件ASCII字符集是中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是中文客戶端導出的中文數據庫文件但是ASCII字符集是改成英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的但是ASCII字符集是改成中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是中文客戶端導出的英文數據庫文件但是數據庫是換過的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是英文客戶端導出的英文數據庫文件
  
  ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是英文客戶端導出的英文數據庫文件但是ASCII字符集是換成中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集侵形模?edmp是中文客戶端導出的英文數據庫文件ASCII字符集是中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是中文客戶端導出的英文數據庫文件但是ASCII字符集是換成英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是英文客戶端導出的中文數據庫文件但是數據庫是換過的ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是英文客戶端導出的中文數據庫文件但是數據庫是換過的但是ASCII字符集是換成中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是英文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的但是ASCII字符集是換成英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
  小結
  
   導入的時候如果客戶端和數據庫的字符集設置不一致導入的時候Oracle並沒有提示
  
   導入的時候如果客戶端和數據庫的字符集設置不一致ORACLE不進行字符集驗證最終結果是數據庫不可用
  
   至於是亂碼還是問號我沒有總結因為沒有必要反正是數據庫不可用
  
   上面的操作其實沒有必要做因為導入的客戶端和目的數據庫字符集不一致導入後肯定不能用但是為了試驗的完整性我還是自己做了一遍希望大家不要嫌煩
  
  向B的c倒入操作客戶機是中文字符集
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是英文客戶端導出的中文數據庫文件ASCII字符集是英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是英文客戶端導出的中文數據庫文件ASCII字符集是改成中文的
  
  導入成功有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是中文客戶端導出的中文數據庫文件ASCII字符集是中文的
  
  導入成功有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是中文客戶端導出的中文數據庫文件但是ASCII字符集是改成英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的ASCII字符集是英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的但是ASCII字符集是改成中文的
  
  導入成功有報錯信息
  
  用英文字符集客戶端是???問號用中文客戶端是正確結果可以看到中文
  
  實際上導入成功
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:cdmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文cdmp是中文客戶端導出的英文數據庫文件但是數據庫是換過的ASCII字符集是中文的
  
  導入成功有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:c_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文c_dmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的ASCII字符集是換成英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是英文客戶端導出的英文數據庫文件ASCII字符集是英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是英文客戶端導出的英文數據庫文件但是ASCII字符集是換成中文的
  
  導入成功有報錯信息
  
  用英文字符集客戶端是???問號用中文客戶端是正確結果可以看到中文
  
  實際上導入成功
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是中文客戶端導出的英文數據庫文件ASCII字符集是中文的
  
  導入成功有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是中文客戶端導出的英文數據庫文件但是ASCII字符集是換成英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是英文客戶端導出的中文數據庫文件但是數據庫是換過的ASCII字符集是英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是英文客戶端導出的中文數據庫文件但是數據庫是換過的但是ASCII字符集是換成中文的
  
  導入成功有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問C數據庫是???(注意問號不是亂碼)實際上導入失敗
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:edmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文edmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的
  
  導入成功有報錯信息
  
  用英文字符集客戶端是???問號用中文客戶端是正確結果可以看到中文
  
  實際上導入成功
  
   D機器是中文字符集B機器是中文數據庫
  
  imp system/manager@c file=c:e_dmp fromuser=test touser=test ignore=y
  
  C數據庫字符集是中文e_dmp是中文客戶端導出的中文數據庫文件但是數據庫是換過的但是ASCII字符集是換成英文的
  
  提示不支持要求的字符集轉換倒入失敗
  
  小結
  
  :導入的時候只有當客戶機和服務器的字符集一致的時候才進行倒入的字符集驗證當導入文件(DMP文件)的ASCII字符集和他們一致的時候才能導入否則報:不支持要求的字符集轉換
  
  :必要條件是導出文件是可用的就是說導出的時候的客戶端和服務器端的字符集是一致的可以解釋的成功
  
  :的成功說明了就算是英文的數據庫保存中文數據在導出後修改DMP文件的字符集還是可以導入到中文數據庫中的
  
  :的成功說明了就算數據庫是轉換過的但是還是可以正確導出中文數據的
  
  :的成功說明了就算是英文的數據庫保存中文數據在導出後修改DMP文件的字符集還是可以導入到中文數據庫中的(即使這個英文數據庫原來是中文的)
  
  :最不可理解的是為什麼不行按道理說它應該是最有把握的
  
  向B的e倒入操作(數據庫是英文數據庫)客戶機D是英文字符集
  
  備注客戶機是中文字符集的情況其實不用測試了因為客戶機和服務器不一致肯定出現問題
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:cdmp fromuser=test touser=test ignore=y
  
  cdmp是英文客戶端導出的中文數據庫文件ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問E數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:c_dmp fromuser=test touser=test ignore=y
  
  c_dmp是英文客戶端導出的中文數據庫文件ASCII字符集是改成中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問E數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:cdmp fromuser=test touser=test ignore=y
  
  cdmp是中文客戶端導出的中文數據庫文件ASCII字符集是中文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問E數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:c_dmp fromuser=test touser=test ignore=y
  
  c_dmp是中文客戶端導出的中文數據庫文件但是ASCII字符集是改成英文的
  
  導入成功沒有報錯信息
  
  但是不管用中文客戶端還是用英文客戶端SQL/PLUS訪問E數據庫是亂碼(注意亂碼不是問號)實際上導入失敗
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:cdmp fromuser=test touser=test ignore=y
  
  cdmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的ASCII字符集是英文的
  
  導入成功沒有報錯信息
  
  用英文客戶端SQL/PLUS訪問E數據庫是中文實際上導入成功
  
   D機器是英文字符集B機器是英文數據庫
  
  imp system/manager@e file=c:c_dmp fromuser=test touser=test ignore=y
  
  >c_dmp是英文客戶端導出的英文數據庫文件但是數據庫是換過的但是ASCII字符集是改成中文的
  
  導入成功沒有報錯信息
  
  用英文客戶端SQL/PLUS訪問E數據庫是???倒入不成功
From:http://tw.wingwit.com/Article/program/Oracle/201311/18526.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.