水煮oracle23——linux剛安裝好的oracle使用insert插入亂碼解決

1向2飛發表於2013-04-08
   linux下oracle字符集問題經常會使oracle使用者有點頭痛,在這裡自己的一點小經驗一塊給大家分享一下。
oracle在安裝時,會有兩種字符集供大家選擇使用:
1》主字符集:character------主要針對char和varchar、varchar2
2》輔助字符集:national character------nchar、nvarchar、nvarchar2
因為在linux下安裝oracle時,環境變數NLS_LANG沒有設定的(windows下在安裝時,會在regedit中自動設定),所以字符集在linux下需要手動新增這個環境變數,這樣在執行select或許insert語句時才會顯示正常的漢字中文,否則會出現亂碼問題
設定方式:
$ vi .bashrc 或者$ vi .bash_profile
新增:export NLS_LANG=American_America.ZHS16GBK
說明:語言_地區.字符集
oracle常用字符集有:UTF8、AL32UTF8---其中al代表all所有語言
 
如何查詢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以上(這也是最常見的情況),用文字編輯器開啟很慢或者完全打不開,可以用以下命令(在unix主機上):

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

修改oracle字符集:
shutdown immediate; //關閉資料庫伺服器
startup mount;
alter session set sql_trace=true;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set  utf8;
alter session set sql_trace=false;
shutdown immediate;
startup;
 
字符集亂碼原理:
插入亂碼,說明客戶端字符集和伺服器字符集沒有成功轉換,chcp查詢windows客戶端字符集936預設,代表ZHS16GBK
注意:使用sqlplus無論select還是insert,sqlplus的字符集一定要和所處的作業系統的字符集一致,這樣oracle資料庫才能正確儲存,不至於發生亂碼。
原理:insert時:
如果作業系統字符集是UTF-8,oracle資料庫的字符集為AL32UTF8
比如:你好 ---這兩個字,首先顯示的作業系統編碼:使用6位的16進製表示,e4,bd,a0,e5,a5,bd
但是客戶端sqlplus的nls_lang=zhs16gbk,作業系統和客戶端sqlplus是不會發生字元轉換的,
而sqlplus用兩位表示一個漢字,這時在sqlplus中有6個位元組,就表示有相當於3個漢字的位元組,
而insert時客戶端sqlplus和oracle資料發生字符集轉換,所以就三個漢字的字元在oracle中就生成了9個位元組。
說明原理:
   字符集轉換是發生在客戶端(比如sqlplus)和oracle資料庫之間的,客戶端和所在作業系統之間是不發生字符集轉換的。
可以根據編碼分析亂碼原因:
 1》檢視oracle資料字符集,通過
select * from nls_database_parameters;
或者
select userenv('language') from dual;
 2》檢視作業系統字符集
windows:chcp 預設是:936----對應ZHS16GBK
linux:預設的就是UTF-8字符集
說明:16gbk----是2位16進製表示一個漢字,utf-8是三個表示一個漢字
 3》客戶端字符集(比如:sqlplus),可以設定變數NLS_LANG
輔助:
windowns作業系統預設字符集:zhs16gbk
linux作業系統預設字符集LANG:utf-8
1、格式: NLS_LANG=language_territory.charset(語言_地域.字符集),每個成分控制了NLS子集的特性。
Language: 指定伺服器訊息的語言, 影響提示資訊是中文還是英文
Territory: 指定伺服器的日期和數字格式,
Charset: 指定字符集。
EY:
NLS_LANG=AMERICAN_CHINA.ZHS16GBK   或 AMERICAN_CHINA.UTF8
#NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
export NLS_LANG
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23890223/viewspace-757996/,如需轉載,請註明出處,否則將追究法律責任。

相關文章