以下轉自 http://blog.itpub.net/29151695/viewspace-1173238/
最近在linux上安裝完oracle 10gR2后,又遇到了字符集亂碼的問題,之前在網上找了下,然后解決完后就不了了之了,這次又碰到此類問題,所以就認真下來花點時間去測試了一番,經過一些測試,現在已經解決了問題,現在把自己遇到的問題和解決方法記錄一下,方便自己日后查找.
測試環境如下:
測試平台: VMware? Workstation 9.0.2 build-1031769 (注:VM沒有分32 or 64位,但如果你安裝64bit操作系統時會報錯,下面會給出解釋)
操作系統: Linux RedHat5.6 64位操作系統
數據庫版本: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit
一、VM平台安裝64位linux操作系統或其它64bit操作系統時報錯.
1.由於之前安裝的都是32的linux操作系統,所以一直相安無事,直到在換了新公司用64bit的linux時才遇到這問題,在VM直接安裝64位的linux時,會報類似操作系統的位數與VM平台的不一樣(由於當時沒有截圖,所以具體的提示語我也忘記了),類似有這樣的提示:“You have configured this virtual machine to use a 64-bit guest operationg system.However,64-bit operation is not possible.This host does not support VT.”解決此問題,我們需要開啟系統的VT支持,即開啟自己電腦BIOS虛擬化技術,這個要看具體個人電腦主要是否支持虛擬化技術,有一個工具可以查看你的電腦CPU和主板是否支持虛擬化,具體自己百度找,非常容易找到,只要在BIOS開啟虛擬化技術后,再重新安裝linux,一切正常了。
二、linux下Oracle顯示中文亂碼 1.Oracle數據庫出現亂碼的原因: <a>操作系統與服務器一致,但客戶端與服務器字符集不一致 <b>客戶端與服務器一致,但操作系統與服務器不一致 2.解決辦法: 設置相關的字符集,保證操作系統、客戶端、數據庫服務器,保證這三者的字符集都相同。
3.針對<a>情況: 設置客戶端的字符集與服務器一致,假如服務器的字符集為:UTF8(建議創建數據庫的時候用這個字符集,中英文都能兼容) 客戶端Linux設置步驟: 1.切換至oracle數據庫的安裝用戶,我的用戶名就是oracle $ su oracle $ cd ~ //進入oracle用戶的家目錄 $ vim .bash_profile //編輯oracle用戶下的.bash_profile文件 .bash_profile文件內容:(每個人的這個文件具體的設置可能都不太一樣,不用擔心,注意紅色那一行就行了) PATH=$PATH:$HOME/bin:/usr/bin:/usr/sbin:/sbin export PATH export ORACLE_SID=orcl export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export PATH=$PATH:$ORACLE_HOME/bin export ORACLE_TERM=xterm export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib export CLASSPATH=$ORACLE_HOME/JRE:ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export NLS_LANG=AMERICAN_AMERICA.UTF8 //設置這個參數就代表設置用戶客戶端的字符集,在創建數據庫的時候不設置這個參數也沒問題,建議是最好規划好自己的庫需要用到什么時候類型的字體,然后再設置這個值,最好保持與數據庫一致,當然這個參數可以隨時改變.(我自己的數據庫是用UTF8字符集)
$ source .bash_profile //執行source命令使修改完的.bash_profile文件生效 至此,設置完畢,再次登錄Oracle數據庫,查詢顯示正常,但有一點要注意,就是如果你插入數據時的字符集不是UTF8下執行的,當你客戶端和服務器都變成UTF8字符集后,以后插入的中文可能顯示就為亂碼了。所以說只有三個點(客戶端、操作系統、數據庫)的字符集保持一致的時候才能讓數據庫里面的中文正常顯示。
3.針對<b>情況 由於我的操作系統是LINUX,所以然我就只對Linux平台給出我自己的方法.因為我自己是在虛擬機上安裝的Linux+Oracle來測試中文字體,所以我選擇了直接在Linux上安裝中文輸入法,通過直接輸入中文進行測試(PS:當然公司服務器不用考慮這個問題,因為程序員都會把自己的字體設置成與數據庫一致的),之所以安裝輸入法,我就想試試在三者保持一樣的情況下是否輸入任何中文都沒有亂碼情況。因為之前我的虛擬機上這三者(操作系統,客戶端,數據庫)字符不一致的時候,經常會出現在測試數據庫里面,有時能正常插入中文並顯示,有時候又不行。因此,為了保證自己輸入法輸入的字符也是UTF8,並且能夠直接在虛擬機上輸入中文,所以直接在linux安裝了中文輸入法。 1.這里順便把LINUX下安裝中文輸入法的步驟也列一下了,也方便以后自己查找。 Linux下切換至root用戶,在虛擬機上加載linux的安裝光盤或者ISO鏡像文件 # mount /dev/cdrom /mnt //把ISO文件加載到mnt這個目錄,然后進入Server目錄查找需要安裝的中文輸入法安裝包 # cd /mnt/Server # ls scim* //列出需要的中文輸入法安裝包,都是以scim開頭的文件 安裝中文輸入法需要的安裝包如下:(要按下面的順序就安裝,安裝完后重啟linux即可) 1. scim-libs-1.4.4-41.el5.x86_64.rpm
# rpm -ivh scim-libs-1.4.4-41.el5.x86_64.rpm //這里只列出安裝第一個包的方法,后面5個包的安裝方法跟這個一樣,至於rmp的用法,自己百度,安裝完后記得要重啟linux.
2. 安裝好中文輸入法后,切換至root用戶進入到目錄 /etc/sysconfig/i18n目錄設置linux操作系統的字符集.
$ echo $LANG (或輸入:locale) //查看oracle用戶下linux操作系統的字符集
# cat /etc/sysconfig/i18n //查看linux配置文件里默認設置的字符集字體
# vim /etc/sysconfig/i18n //修改i18n里面linux的默認字符集
i18n文件內容如下:
LANG="en_US.GBK" //把這一項的值改成UTF8字符集,改為:LANG="en_US.UTF-8" en_US代表系統本身是用英文顯示的,中文為:zh_CN
# source /etc/sysconfig/i18n //執行source 命令使i18n文件的修改生效.
(PS:其實在修改這個文件夾時候,我遇到一個問題,就是我在linux下找不到ZHS16GBK這個字符集,我用的是Redhat5.6 x64系統,所以當我把LANG設置成:LANG="en_US.ZHS16GBK"的時候,然后再執行source命令的時候,發現會報錯,意思是說沒有ZHS16GBK這個字符集,用命令locale -a也確實查找不到ZHS16GBK這個字符集,這就是為什么時候我在測試儀環境選擇UTF8作為三者的字符集的原因,不過后來想想,一般公司的服務器上只要客戶端和oracle服務器的字符集相同時,操作系統的不用理會應該影響也不大,因為程序員開發時,可以在自己的程序指定ZHS16GBK編碼,這樣程序+客戶端+oracle服務器的字符集就一致了,不知道這個猜想正確否?目前還在網上查找能否安裝ZHS16GBK字符集的方法).
3.修改完后,再切換回oracle用戶,再用命令locale或者是echo $LANG查看下當前的操作系統字符集,你會發現已經和客戶端和數據庫的一致了,都是UTF8.這個時候你再進入oracle數據庫的測試環境時,對表插入中文,修改,查詢都正常顯示了,不會再有亂碼的問題了。
總結:
字符集的轉換是一個非常復雜的過程,上面只是我自己遇到的問題,可能還有一些更復雜的問題,待我發現后再慢慢補充,但前提無非就是要保持三者(操作系統、客戶端、數據庫服務器)的字符集一致,另外我發現不同的字符集也是可以轉換的,但轉換的話會有危險,因為你也不清楚哪些時候的轉換就出錯了,所以最保險的方法就是保持一致. 並且數據庫的字符集最好不要更改,一除非是測試環境,正式的生產庫最好不要改,風險非常大。所以然在創建數據庫的時候就要想好用哪一種字符集.
Example:
SYS@orcl>select * from test;