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