首頁  >  文章  >  php教程  >  解決Linux下Oracle中文亂碼的一些心得體會

解決Linux下Oracle中文亂碼的一些心得體會

高洛峰
高洛峰原創
2016-12-15 16:46:572166瀏覽

最近在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.由於先前安裝的都是作業系統所以一直相安無事,直到在換了新公司用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資料庫出現亂碼的原因:
           ,但作業系統與伺服器不一致
        2 .解決方法:
            設定相關的字元集,並保證作業系統、客戶端、資料庫伺服器,保證這三者的字元集都相同。

        3.針對情況:
            設定客戶端的字元集與伺服器一致,而伺服器步驟:
1.切換至oracle資料庫的安裝用戶,我的用戶名是oracle
                                                           $ cd ~                       //進入oracle使用者的家庭目錄
               $ vim .bash_profile                                   .bash_profile文件內容:(每個人的這個文件特定的設定可能都不太一樣,不用擔心,注意紅色那一行就行了)                        PATH=$PATH:$HOME/bin:/usr/bin:/usr/sbin:/sbin
                                               導出PATH
                                                 導出ORACLE_SID=orcl 
                                               導出ORACLE_BASE=/u01/app/oracle 
                                                導出ORACLE_HOME=$ORACLE_BASE/product/10.2 .0/db_1 
                                               導出PATH=$PATH:$ORACLE_HOME/bin 
                                                導出ORACLE_TERM=xterm 
                                               導出LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
                                                導出CLASSPATH=$ORACLE_HOME/JRE:ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

                                                 字體,然後再設定這個值,最好保持與資料庫一致,當然這個參數可以隨時改變。 (我自己的資料庫是用UTF8字集)

                                 //執行source指令使完成的。 bash_profile檔案生效
                          至此,設定完畢,再次登入Oracle資料庫,查詢顯示正常,但有一點要注意,就是如果你插入資料時的字元集不是集後,以後插入的中文可能顯示就為亂碼了。所以說只有三個點(客戶端、作業系統、資料庫)的字元集保持一致的時候才能讓資料庫的中文顯示正常。

     裡面     3.針對情境       
由於我的作業系統是LINUX,所以然我就只對Linux平台給我自己的方法.因為我自己是在虛擬機上安裝的Linux+Oracle來測試中文字體,所以我選擇了直接在Linux上安裝中文輸入法,透過直接輸入中文來測試(PS:當然公司伺服器不用考慮這個問題,因為程式設計師都會把自己的字體設定成與資料庫一致的),之所以安裝輸入法,我就想試試在三者保持一樣的情況下是否輸入任何中文都沒有亂碼情況。因為之前我的虛擬機器上這三者(作業系統,客戶端,資料庫)字元不一致的時候,常常會出現在測試資料庫裡面,有時能正常插入中文並顯示,有時又不行。因此,為了確保自己輸入法輸入的字元也是UTF8,並且能夠直接在虛擬機器上輸入中文,所以直接在linux安裝了中文輸入法。
               1.這裡順便把LINUX下安裝中文輸入法的步驟也列一下了,也方便以後自己查找。
                                                # mount /dev/cdrom /mnt             輸入法安裝包
                                       # cd /mnt/Server
                                      # ls scim*                                          //列出需要的中文輸入法安裝包,都是以scim開頭的文件
                         安裝中文輸入法需要的安裝包如下:(要按下面的順序就安裝,安裝完後重啟linux即可)
                                                                                                            chinese-standard-0.0.2-1.el5.x86_64.rpm                                            4.    scim-tables-0.5.6-7.x86_64.rpm                                            5.    scim-tables-chinese-0.5.6-7.x86_64.rpm                                            6.    scim -pinyin-0.5.91-16.el5.x86_64.rpm
# rpm -ivh  scim-libs-1.4.4-41.el5.x86_64.rpm                     //這裡只列出使用第一個包的方法,並為自己使用的方法,跟自己使用於安裝的方法百度,安裝完後記得要重啟linux.

               2. 安裝中文輸入法後,切換至root用戶進入目錄/etc/sys                     $ echo $LANG (或輸入:locale)   //檢視oracle用戶下linux作業系統的字元集
                             //檢視linux設定檔裡預設的字元集字型
                          //修改i18n裡面linux的預設字元集
                                                                地本身是用英文顯示的,中文為:zh_CN                                                           # source 讓i18n文件的修改生效.
(PS:其實在修改這個資料夾時候,我遇到一個問題,就是我在linux下找不到ZHS16GBK這個字元集,我用的是Redhat5.6 x64系統,所以當我把LANG設定成:LANG="en_US.ZHS16GBK"的時候,然後再執行source指令的時候,發現會報錯,意思是說沒有ZHS16GBK這個字元集,用指令locale -a也確實查找不到ZHS16GBK這個字元集,這就是為什麼時候我在測試儀環境選擇UTF8作為三者的字元集的原因,不過後來想想,一般公司的伺服器上只要客戶端和oracle伺服器的字元集相同時,作業系統的不用理會應該影響也不大,因為程式設計師開發時,可以在自己的程式指定ZHS16GBK編碼,這樣程式+客戶端+oracle伺服器的字元集就一致了,不知道這個猜想正確否?目前還在網上查找能否安裝ZHS16GBK字符集的方法).

           已經和客戶端和資料庫的一致了,都是UTF8.這時候你再進入oracle資料庫的測試環境時,對錶插入中文,修改,查詢都正常顯示了,不會再有亂碼的問題了。


總結:
字符集的轉換是一個非常複雜的過程,上面只是我自己遇到的問題,可能還有一些更複雜的問題,待我發現後再慢慢補充,但前提無非就是要保持三者(操作系統、客戶端、資料庫伺服器)的字元集一致,另外我發現不同的字元集也是可以轉換的,但轉換的話會有危險,因為你也不清楚哪些時候的轉換就出錯了,所以最保險的方法就是保持一致.  且資料庫的字元集最好不要更改,一除非是測試環境,正式的生產庫最好不要改,風險非常大。所以然在建立資料庫的時候就要想好用哪一種字元集.


Example:

          SYS@orcl>select * from test;       -----------------------------------        99 我們都是好孩子       123 廣州華資訊有限公司SYS@orcl >insert into test values(3,'中國廣州白雲區');1 row created.SYS@orcl>commit;Commit complete.SYS@orcl>select * from test;        ID NAME---------- ----------------------------------------        99 我們都是好孩子       123 廣州華訊息有限公司         3 中國廣州白雲區



更多解決Linux下Oracle中文亂碼的一些心得體會 網相關文章請關注PHP中文更多解決Linux下Oracle中文亂碼的一些心得體會 網相關文章請關注PHP中文更多解中文!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn