作者: 王德田 發(fā)表于 2010-09-25 12:21 原文鏈接 閱讀: 3 評(píng)論: 0

          關(guān)于ORACLE數(shù)據(jù)庫(kù)中漢字顯示亂碼問(wèn)題的探討

          1   引言

               ORACLE數(shù)據(jù)庫(kù)作為業(yè)界領(lǐng)先的數(shù)據(jù)庫(kù)產(chǎn)品,近年來(lái)在國(guó)內(nèi)大中型企業(yè)中得到了廣泛的應(yīng)用。雖然ORACLE數(shù)據(jù)庫(kù)產(chǎn)品本身在本地化方面已做得相當(dāng)成熟,但還是有不少用戶反應(yīng)漢字顯示亂碼的問(wèn)題。如對(duì)同一數(shù)據(jù)庫(kù)不同的用戶對(duì)同一表中的username查詢卻得出了不同的結(jié)果: “ORACLE??????”和“ORACLE中國(guó)有限公司”,顯然結(jié)果中將中文字符顯示為亂碼,那么為什么呢?字符集的設(shè)置不當(dāng)是影響ORACLE數(shù)據(jù)庫(kù)漢字顯示的關(guān)鍵問(wèn)題。

          2   關(guān)于字符集

               字符集是ORACLE為適應(yīng)不同語(yǔ)言文字顯示而設(shè)定的。用于漢字顯示的字符集主要有ZHS16CGB231280、ZHS16GBK、US7ASCII和UTF-8等。字符集同時(shí)存在于服務(wù)器端和客戶端。服務(wù)器端字符集是在安裝ORACLE時(shí)指定的,字符集登記信息存儲(chǔ)在ORACLE數(shù)據(jù)庫(kù)字典的V$NLS_PARAMETERS表中;而客戶端字符集是在系統(tǒng)注冊(cè)表(WINDOWS系統(tǒng))或在用戶的環(huán)境變量(UNIX系統(tǒng))中設(shè)定的。

          3   字符集的構(gòu)成與設(shè)定

               字符集的構(gòu)成與設(shè)定方式分為客戶端與服務(wù)器端兩種:
               (1)客戶端字符集的構(gòu)成與設(shè)定。客戶端的字符集是由當(dāng)前用戶的環(huán)境變量NLS_LANG設(shè)定的。環(huán)境變量NLS_LANG的構(gòu)成:
          NLS_LANG=language_territory.charset     
          其中,
          language   指定服務(wù)器消息的語(yǔ)言
          territory    指定服務(wù)器的日期和數(shù)字格式
          charset     指定字符集
          三個(gè)成分可以任意組合,例如:
          AMERICAN_AMERICA.US7SCII
          SIMPLIFIED CHINESE_CHINA.ZHS16GBK
          AMERICAN_AMERICA. ZHS16GBK
               客戶端字符集的設(shè)定方法針對(duì)不同操作系統(tǒng)設(shè)定方法稍有不同:WINDOWS系統(tǒng)是在注冊(cè)表項(xiàng):HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG中設(shè)定;UNIX系統(tǒng)是在當(dāng)前用戶的環(huán)境變量中設(shè)定,如在當(dāng)前用戶的profile文件中增加一行如下代碼:
          NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK;export NLS_LANG
               (2)服務(wù)端字符集的構(gòu)成與設(shè)定。服務(wù)端字符集的構(gòu)成體現(xiàn)在數(shù)據(jù)字典表V$NLS_PARAMETERS的NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET三項(xiàng)取值上,其中NLS_CHARACTERSET的取值就是具體的數(shù)據(jù)庫(kù)字符集。
          如利用查詢語(yǔ)句SQL>SELECT * FROM V$NLS_PARAMETERS;
          可得到如下結(jié)果:
          PARAMETER                    VALUE
          ------------------------------------------------------------
          NLS_LANGUAGE            SIMPLIFIED CHINESE
          NLS_TERRITORY                 CHINA
          ……
          NLS_CHARACTERSET            ZHS16GBK
          ……
               即當(dāng)前數(shù)據(jù)庫(kù)使用的字符集是ZHS16GBK。
               數(shù)據(jù)庫(kù)服務(wù)端的字符集是在創(chuàng)建數(shù)據(jù)時(shí)設(shè)定的。但可通過(guò)如下方法對(duì)已設(shè)定的字符集進(jìn)行修改:
               方法一:重建數(shù)據(jù)庫(kù)。建立數(shù)據(jù)庫(kù)時(shí)將數(shù)據(jù)庫(kù)的字符集設(shè)定為所需字符集。
               方法二:修改SYS.PROPS$表。即用SYS用戶登陸ORACLE后,利用下面語(yǔ)句修改相應(yīng)的字符集并提交:
          SQL>UPDATE PROPS$ SET VALUE$=’ZHS16GBK‘
          WHERE NAME=’NLS_CHARACTERSET’;
          SQL>COMMIT;
               通過(guò)此種方法來(lái)更改數(shù)據(jù)庫(kù)字符集,只對(duì)更改后的數(shù)據(jù)有效,即數(shù)據(jù)庫(kù)中原來(lái)的數(shù)據(jù)仍以原字符集被存儲(chǔ)。
               另外,有的還利用CREATE DATABASE CHARACTER SET ZHS16GBK命令暫時(shí)的修改字符集,當(dāng)重啟數(shù)據(jù)庫(kù)后,數(shù)據(jù)庫(kù)字符集將恢復(fù)原來(lái)的字符集。

          4   常見(jiàn)的漢字亂碼問(wèn)題及解決方案

               要在客戶端正確顯示ORACLE數(shù)據(jù)庫(kù)中的漢字信息,首先必須使客戶端的字符集與服務(wù)器端的字符集一致;其次是加載到ORACLE數(shù)據(jù)庫(kù)的數(shù)據(jù)字符集必須與服務(wù)器字符集一致。據(jù)此,漢字顯示亂碼的問(wèn)題大致可以分為以下幾種情況:
               (1)客戶端字符集與服務(wù)器端字符集不同,服務(wù)器端字符集與加載數(shù)據(jù)字符集一致。這種情況是最常見(jiàn)的,只要把客戶端的字符集設(shè)置正確即可。具體解決方案:
                第一步:查詢V$NLS_PARAMETERS得到服務(wù)端的字符集:
          SQL>SELECT * FROM V$NLS_PARAMETERS;
             第二步:根據(jù)服務(wù)端的字符集設(shè)定客戶端的字符集,設(shè)定方法參見(jiàn)客戶端的字符集的設(shè)定方式。
          以UNIX系統(tǒng)為例,可在當(dāng)前用戶的profile文件中增加如下兩行:
               NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK
               export NLS_LANG
               (2)客戶端字符集與服務(wù)器端字符集相同,服務(wù)器端字符集與加載數(shù)據(jù)字符集不一致。這種情況一般發(fā)生在ORACLE版本升級(jí)或重新安裝數(shù)據(jù)庫(kù)時(shí)選擇了與原來(lái)數(shù)據(jù)庫(kù)不同的字符集,而恢復(fù)加載的備份數(shù)據(jù)仍是按原字符集卸出的場(chǎng)合。另一種情況是加載從其它使用不同字符集的ORACLE數(shù)據(jù)庫(kù)卸出的數(shù)據(jù)。在這兩種情況中,不管客戶端字符集與服務(wù)器端字符集是否一致都無(wú)法正確顯示漢字。具體解決方案:
               方案一:按服務(wù)端字符集的修改方法修改服務(wù)端字符集與加載數(shù)據(jù)字符集一致,然后導(dǎo)入數(shù)據(jù)。
               方案二:利用數(shù)據(jù)格式轉(zhuǎn)儲(chǔ),避開(kāi)字符集帶來(lái)的問(wèn)題。即先將加載數(shù)據(jù)倒入到與其字符集一致的數(shù)據(jù)庫(kù)中,然后再將數(shù)據(jù)要么按文本格式導(dǎo)出(數(shù)據(jù)量較小的情況下),要么通過(guò)第三方工具(如POWER BUILDER,ACCESS,F(xiàn)OXPRO等)倒出數(shù)據(jù),最后將倒出的數(shù)據(jù)導(dǎo)入到目標(biāo)數(shù)據(jù)庫(kù)中。
               (3)客戶端字符集與服務(wù)器端字符集不同,服務(wù)端字符集與輸入數(shù)據(jù)字符集不同。這種情況是在客戶端字符集與服務(wù)器端字符集不一致時(shí),從客戶端輸入了漢字信息。輸入的這些信息即便是把客戶端字符集更改正確,也無(wú)法顯示漢字。解決方案:修改客戶端字符集與服務(wù)端字符集一致后,重新輸入數(shù)據(jù)。

           

          其中:

          sqlplus亂碼解決

          export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK (顯示英文)

          export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.zhs16cgb231280
                                                                                                 (顯示簡(jiǎn)體中文)

          5   結(jié)束語(yǔ)

               根據(jù)ORACLE官方文檔的說(shuō)明,一旦數(shù)據(jù)庫(kù)創(chuàng)建后,數(shù)據(jù)庫(kù)的字符集是不能改變的。因此,提前考慮自己的數(shù)據(jù)庫(kù)將選用哪一種字符集是十分重要的。數(shù)據(jù)庫(kù)字符集選擇的一般規(guī)則是將數(shù)據(jù)庫(kù)字符集設(shè)定為操作系統(tǒng)本地字符集的一個(gè)超集,同時(shí)數(shù)據(jù)庫(kù)字符集也應(yīng)該是所有客戶字符集的超集。如同樣是中文環(huán)境,在選擇ZHS16CGB231280還是ZHS16GBK時(shí),我們更多的情況是選擇ZHS16GBK,因?yàn)樗薢HS16CGB231280字符集。

          參考文獻(xiàn)

               1 (美)JONATHAN GENNICK CAROL MCCULLOUGH-DIETER GERRIT-JAN LINKER ,譯者:趙艷勤, 劉冠英, 秦玉杰 等.《ORACLE8I DBA寶典》.電子工業(yè)出版社
               2 JASON COUCHMAN,SUDHEER MARISETTI.《OCP ORACLE9I DATABASE:FUNDAMENTALS I EXAM GUIDE》.出版社: MCGRAW-HILL
               3 ORACLE Corporation.ORACLE 9i Database Administration Fundamentas I Student Guide》

          評(píng)論: 0 查看評(píng)論 發(fā)表評(píng)論

          程序員找工作,就在博客園


          最新新聞:
          · 有史以來(lái)最偉大的12款PC游戲(2010-09-26 11:31)
          · UCWEB購(gòu)手機(jī)應(yīng)用軟件來(lái)電通 數(shù)據(jù)將逐步遷移(2010-09-26 11:09)
          · 喬布斯郵件確認(rèn)新款A(yù)pple TV 9月出貨(2010-09-26 11:05)
          · 雙底座接口 蘋果中國(guó)申請(qǐng)iPad專利曝光(2010-09-26 10:49)
          · 惠普回應(yīng)IBM質(zhì)疑:研發(fā)支出不能反映創(chuàng)新水平(2010-09-26 10:46)

          編輯推薦:關(guān)于Java之父離職原因的隨想

          網(wǎng)站導(dǎo)航:博客園首頁(yè)  個(gè)人主頁(yè)  新聞  閃存  小組  博問(wèn)  社區(qū)  知識(shí)庫(kù)


          文章來(lái)源:http://www.cnblogs.com/wangdetian168/archive/2010/09/25/oracle-bianma.html
          posted on 2010-09-25 12:21 sanmao 閱讀(1387) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 建平县| 察雅县| 东丰县| 习水县| 普宁市| 台州市| 法库县| 丰顺县| 鄂托克前旗| 平凉市| 明光市| 武陟县| 增城市| 渝中区| 延长县| 称多县| 乌鲁木齐市| 高清| 承德市| 元朗区| 澎湖县| 佛冈县| 郑州市| 鄂伦春自治旗| 乐至县| 五华县| 澎湖县| 安乡县| 青浦区| 曲水县| 闵行区| 古浪县| 内黄县| 桃园县| 大洼县| 镇康县| 贡山| 溧水县| 高邮市| 蕉岭县| 云南省|