oracle數據庫字符集導致數據亂碼的問題


前言:

  將表導入數據庫后,發現很多的亂碼,而原數據在原庫中是沒有問題的,找了很多資料來看,發現可能是字符集的問題,檢查處理后,問題得到了解決,撰文記之:

  oracle數據庫常用的字符編碼格式為ZHS16GBK,下面就是更換字符集實操的記錄:

[oracle@woitumi-197 dbs]$ sqlplus / as sysdba 啟動數據庫:
SQL
> startup SQL>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 ZHS16GBK;

接下來可能出現兩種情況:

ERROR at line 1  RA-12721: operation cannot execute when other sessions are active
1、若出現上面的錯誤,使用下面的辦法進行修改,使用INTERNAL_USE可以跳過超集的檢查:

SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;

2、結果報錯,提示新字符集必須是老字符集的超集。

ORA-12712: new character set must be a superset of old character set
RROR at line 1:

需要強制轉換:

>ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

以上兩種情況是我所遇到的問題,在執行了相關命令后,執行最后步驟:

>shutdown immediate; >STARTUP;

附:

  在數據庫備份文件導入時,

1. oracel server端的字符集;

2. oracle 遠程連接工具的字符集;

3. 導出dmp文件數據庫的的字符集。

 這三者必須相同,操作后的數據,才不會出現亂碼

查詢方法:

查詢oracle server端的字符集

有很多種方法可以查出oracle server端的字符集,比較直觀的查詢方法是以下這種:

SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- SIMPLIFIED CHINESE_CHINA.ZHS16GBK SQL>select userenv(‘language’) from dual; AMERICAN _ AMERICA. ZHS16GBK

如何查詢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

如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在linux主機上):

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM