水煮oracle23——linux剛安裝好的oracle使用insert插入亂碼解決
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;
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資料庫之間的,客戶端和所在作業系統之間是不發生字符集轉換的。
注意:使用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
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 水煮oracle十六——《linux下oracle9i的安裝OracleLinux
- mysql 插入中文亂碼解決方案 轉MySql
- 在linux中安裝mysql並解決中文亂碼問題LinuxMySql
- linux 安裝字型解決JAVA圖形中文亂碼問題LinuxJava
- ORACLE亂碼解決方案Oracle
- opensuse 安裝oracle 介面亂碼Oracle
- 解決Linux中文亂碼Linux
- oracle字元亂碼問題的解決Oracle字元
- 解決oracle10g安裝後的中文顯示亂碼(轉貼學習)Oracle
- 解決MySQL中文亂碼和插入中文不顯示的方法MySql
- linux遠端桌面亂碼解決及引起的相關問題、字型檔安裝Linux
- 徹底解決Oracle中文亂碼Oracle
- Oracle 10g 安裝中文亂碼Oracle 10g
- oracle insert all多表插入的示例Oracle
- 安裝rlwrap(解決Sqlplus 方向鍵出現亂碼)SQL
- Linux中文亂碼,安裝兩個包Linux
- linux使用vim(vi)中文亂碼的終極解決辦法Linux
- Oracle 使用一條insert語句完成多表插入Oracle
- Oracle 生僻字亂碼解決方案Oracle
- Oracle11g字元亂碼解決Oracle字元
- Oracle10g EM亂碼解決Oracle
- [oracle]解決centos 7下oracle的中文亂碼問題OracleCentOS
- 安裝Redhat Linux 9.0 後,在命令列下中文顯示為亂碼的解決方案(轉)RedhatLinux命令列
- Win8安裝中文軟體出現亂碼解決方法
- windows10系統安裝軟體出現亂碼怎麼解決 windows10電腦軟體亂碼的解決方法Windows
- Linux下解決matplotlib中文亂碼的方法Linux
- Linux下安裝oracle,遇到錯誤的解決辦法LinuxOracle
- 解決使用Git Bash亂碼問題Git
- 解決pl/sql developer中資料庫插入資料亂碼問題SQLDeveloper資料庫
- 解決Hibernate向MySQL資料庫插入中文亂碼問題MySql資料庫
- oracle 10g em 登入亂碼的解決Oracle 10g
- webView的使用及其亂碼問題的解決方案WebView
- win10新裝軟體亂碼怎麼解決_win10新裝軟體顯示亂碼的解決方案Win10
- 水煮oracle19——《oracle rac安裝中mount -t ocfs2的問題Oracle
- Linux終端中文菱形亂碼解決方案Linux
- Linux下安裝Oracle時報swap不夠解決方法LinuxOracle
- LINUX下安裝ORACLE時SWAP不足的兩種解決方法LinuxOracle
- oracle 輸出中文亂碼問題解決方案Oracle