<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    作者: 王德田 發表于 2010-09-25 12:21 原文鏈接 閱讀: 3 評論: 0

    關于ORACLE數據庫中漢字顯示亂碼問題的探討

    1   引言

         ORACLE數據庫作為業界領先的數據庫產品,近年來在國內大中型企業中得到了廣泛的應用。雖然ORACLE數據庫產品本身在本地化方面已做得相當成熟,但還是有不少用戶反應漢字顯示亂碼的問題。如對同一數據庫不同的用戶對同一表中的username查詢卻得出了不同的結果: “ORACLE??????”和“ORACLE中國有限公司”,顯然結果中將中文字符顯示為亂碼,那么為什么呢?字符集的設置不當是影響ORACLE數據庫漢字顯示的關鍵問題。

    2   關于字符集

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

    3   字符集的構成與設定

         字符集的構成與設定方式分為客戶端與服務器端兩種:
         (1)客戶端字符集的構成與設定??蛻舳说淖址怯僧斍坝脩舻沫h境變量NLS_LANG設定的。環境變量NLS_LANG的構成:
    NLS_LANG=language_territory.charset     
    其中,
    language   指定服務器消息的語言
    territory    指定服務器的日期和數字格式
    charset     指定字符集
    三個成分可以任意組合,例如:
    AMERICAN_AMERICA.US7SCII
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    AMERICAN_AMERICA. ZHS16GBK
         客戶端字符集的設定方法針對不同操作系統設定方法稍有不同:WINDOWS系統是在注冊表項:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG中設定;UNIX系統是在當前用戶的環境變量中設定,如在當前用戶的profile文件中增加一行如下代碼:
    NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK;export NLS_LANG
         (2)服務端字符集的構成與設定。服務端字符集的構成體現在數據字典表V$NLS_PARAMETERS的NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET三項取值上,其中NLS_CHARACTERSET的取值就是具體的數據庫字符集。
    如利用查詢語句SQL>SELECT * FROM V$NLS_PARAMETERS;
    可得到如下結果:
    PARAMETER                    VALUE
    ------------------------------------------------------------
    NLS_LANGUAGE            SIMPLIFIED CHINESE
    NLS_TERRITORY                 CHINA
    ……
    NLS_CHARACTERSET            ZHS16GBK
    ……
         即當前數據庫使用的字符集是ZHS16GBK。
         數據庫服務端的字符集是在創建數據時設定的。但可通過如下方法對已設定的字符集進行修改:
         方法一:重建數據庫。建立數據庫時將數據庫的字符集設定為所需字符集。
         方法二:修改SYS.PROPS$表。即用SYS用戶登陸ORACLE后,利用下面語句修改相應的字符集并提交:
    SQL>UPDATE PROPS$ SET VALUE$=’ZHS16GBK‘
    WHERE NAME=’NLS_CHARACTERSET’;
    SQL>COMMIT;
         通過此種方法來更改數據庫字符集,只對更改后的數據有效,即數據庫中原來的數據仍以原字符集被存儲。
         另外,有的還利用CREATE DATABASE CHARACTER SET ZHS16GBK命令暫時的修改字符集,當重啟數據庫后,數據庫字符集將恢復原來的字符集。

    4   常見的漢字亂碼問題及解決方案

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

     

    其中:

    sqlplus亂碼解決

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

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

    5   結束語

         根據ORACLE官方文檔的說明,一旦數據庫創建后,數據庫的字符集是不能改變的。因此,提前考慮自己的數據庫將選用哪一種字符集是十分重要的。數據庫字符集選擇的一般規則是將數據庫字符集設定為操作系統本地字符集的一個超集,同時數據庫字符集也應該是所有客戶字符集的超集。如同樣是中文環境,在選擇ZHS16CGB231280還是ZHS16GBK時,我們更多的情況是選擇ZHS16GBK,因為它包含了ZHS16CGB231280字符集。

    參考文獻

         1 (美)JONATHAN GENNICK CAROL MCCULLOUGH-DIETER GERRIT-JAN LINKER ,譯者:趙艷勤, 劉冠英, 秦玉杰 等.《ORACLE8I DBA寶典》.電子工業出版社
         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》

    評論: 0 查看評論 發表評論

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


    最新新聞:
    · 有史以來最偉大的12款PC游戲(2010-09-26 11:31)
    · UCWEB購手機應用軟件來電通 數據將逐步遷移(2010-09-26 11:09)
    · 喬布斯郵件確認新款Apple TV 9月出貨(2010-09-26 11:05)
    · 雙底座接口 蘋果中國申請iPad專利曝光(2010-09-26 10:49)
    · 惠普回應IBM質疑:研發支出不能反映創新水平(2010-09-26 10:46)

    編輯推薦:關于Java之父離職原因的隨想

    網站導航:博客園首頁  個人主頁  新聞  閃存  小組  博問  社區  知識庫


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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    常用鏈接

    留言簿(5)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲无人区一区二区三区| 污网站在线观看免费| 亚洲人成人网站色www| 天堂在线免费观看中文版| 久久国产色AV免费看| 91福利免费网站在线观看| 亚洲AV网一区二区三区 | 国产成人亚洲精品电影| 亚洲精品在线免费观看| 日韩亚洲一区二区三区| 亚洲国产成人久久综合一区77| 日韩精品福利片午夜免费观着| 精品一区二区三区免费毛片爱 | 亚洲性在线看高清h片| 日本一道一区二区免费看| 黄色免费网站网址| 麻花传媒剧在线mv免费观看| 美女视频黄的免费视频网页| 免费人成在线观看网站品爱网日本| 羞羞视频免费网站日本| 亚洲av无码成人精品区一本二本| 亚洲永久在线观看| 亚洲videos| 国产综合亚洲专区在线| 亚洲精品色婷婷在线影院| 啊v在线免费观看| 麻豆国产VA免费精品高清在线| 最近中文字幕无吗高清免费视频| 永久免费av无码网站韩国毛片| av无码久久久久不卡免费网站| 8x成人永久免费视频| 四虎精品视频在线永久免费观看| 24小时免费看片| 免费精品国偷自产在线在线| 国产又黄又爽又大的免费视频 | 俄罗斯极品美女毛片免费播放| 永久黄网站色视频免费直播| 四虎影视永久免费视频观看| 亚洲国产中文v高清在线观看| 2022中文字字幕久亚洲| 亚洲精品无码久久久久|