oracle打开dmp文件乱码,oracle中导入dmp字符乱码分析和解决方案
一、什么是oracle字符集
Oracle字符集是一個字節數據的解釋的符號集合,有大小之分,有相互的包容關系。ORACLE 支持國家語言的體系結構允許你使用本地化語言來存儲,處理,檢索數據。它使數據庫工具,錯誤消息,排序次序,日期,時間,貨幣,數字,和日歷自動適應本地化語言和平臺。
影響oracle數據庫字符集最重要的參數是NLS_LANG參數。它的格式如下:
NLS_LANG = language_territory.charset
它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。其中:
Language 指定服務器消息的語言,territory 指定服務器的日期和數字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK。
從NLS_LANG的組成我們可以看出,真正影響數據庫字符集的其實是第三部分。所以兩個數據庫之間的字符集只要第三部分一樣就可以相互導入導出數據,前面影響的只是提示信息是中文還是英文。
二、如何查詢Oracle的字符集
1、查詢oracle server端的字符集
有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種:
SQL>select userenv(‘language’) from dual;
結果類似如下:AMERICAN _ AMERICA. ZHS16GBK
2、如何查詢dmp文件的字符集
用oracle的exp工具導出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節記錄了dmp文件的字符集。如果dmp文件不大,比如只有幾M或幾十M,可以用UltraEdit打開(16進制方式),看第2第3個字節的內容,如0354,然后用以下SQL查出它對應的字符集:
SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;
結果是: ZHS16GBK
3、查詢oracle client端的字符集
在windows平臺下,就是注冊表里面HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG 。
如果檢查的結果發現server端與client端字符集不一致,請統一修改為同server端相同的字符集。
三、修改oracle的字符集
1、修改server端字符集(我試過的)
若此時數據庫服務器已啟動,則先執行SHUTDOWN IMMEDIATE命令關閉數據庫服務器,然后執行以下命令:
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK(這里為你所要轉換成的字符集); //跳過超子集檢測
SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK(這里為你所要轉換成的字符集);
執行后出錯ORA-00933: SQL 命令未正確結束,不過執行上一行命令已經生效,這一句出錯對修改似乎沒有影響。
下面關閉數據庫,然后重新啟動:
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
2、修改dmp文件字符集(這個我沒有試,借鑒來的)
上文說過,dmp文件的第2第3字節記錄了字符集信息,因此直接修改dmp文件的第2第3字節的內容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關系的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因為改的只是dmp文件,所以影響不大。
具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節。比如想將dmp文件的字符集改為ZHS16GBK,可以用以下SQL查出該種字符集對應的16進制代碼:
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
結果是:0354
然后將dmp文件的2、3字節修改為0354即可。
3. 修改客戶端的文件字符集和新配置一個環境變量:
1修改客戶端字符集:
運行regedit命令,在注冊表中找到這個下的鍵HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG
將其值改為上述服務器端你所修改的字符編碼值。
2 新配置一個環境變量
點擊我的電腦右鍵》屬性》高級》環境變量》新建一個用戶變量,其變量名是:NLS_LANG;
變量值是:SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1(這里的字符集和你在服務器端和客戶端修改的字符集必須一致)。
注意:最后一定要重啟oracle的主服務!不然亂碼問題依舊存在,這是我今天糾結了很久的問題。
總結:一般將數據庫服務器端,客戶端,還有新配置的環境變量的值修改成和dmp文檔一樣的字符集就可解決亂碼的問題!
解決方案:
在導入DMP文件前,在客戶端導入與服務器一致的環境變量。
例如:export NLS_LANG=American_America.ZHS16GBK
總結
以上是生活随笔為你收集整理的oracle打开dmp文件乱码,oracle中导入dmp字符乱码分析和解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于strassen矩阵乘法的矩阵大小不
- 下一篇: 打破多项存储世界记录,宏杉科技表示很淡定