隨筆-17  評論-64  文章-79  trackbacks-1
          在國內(nèi)外大中型數(shù)據(jù)庫管理系統(tǒng)中,把ORACLE作為數(shù)據(jù)庫管理平臺的用戶比較多。ORACLE ? 不論是數(shù)據(jù)庫管理能力還是安全性都是無可非議的,但是,它在漢字信息的顯示方面著實給中國用戶帶來不少麻煩,筆者多年從事ORACLE數(shù)據(jù)庫管理,經(jīng)常收到周圍用戶和外地用戶反映有關(guān)ORACLE數(shù)據(jù)庫漢字顯示問題的求援信,主要現(xiàn)象是把漢字顯示為不可識別的亂碼,造成原來大量信息無法使用。本文將就這一問題產(chǎn)生的原因和解決辦法進行一些探討,供存在這方面問題的用戶朋友參考。 ? ?
          ? ?
          ? ---- ? 1、原因分析 ? ?
          ? ?
          ? ---- ? 通過對用戶反映情況的分析,發(fā)現(xiàn)字符集的設(shè)置不當是影響ORACLE數(shù)據(jù)庫漢字顯示的關(guān)鍵問題。那么字符集是怎么一會事呢?字符集是ORACLE ? 為適應(yīng)不同語言文字顯示而設(shè)定的。用于漢字顯示的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。字符集不僅需在服務(wù)器端存在,而且客戶端也必須有字符集注冊。服務(wù)器端,字符集是在安裝ORACLE時指定的,字符集登記信息存儲在ORACLE數(shù)據(jù)庫字典的V$NLS_PARAMETERS表中;客戶端,字符集分兩種情況,一種情況是sql*net ? 2.0以下版本,字符集是在windows的系統(tǒng)目錄下的oracle.ini文件中登記的;另一種情況是sql*net ? 2.0以上(即32位)版本,字符集是在windows的系統(tǒng)注冊表中登記的。要在客戶端正確顯示ORACLE ? 數(shù)據(jù)庫漢字信息,首先必須使服務(wù)器端的字符集與客戶端的字符集一致;其次是加載到ORACLE數(shù)據(jù)庫的數(shù)據(jù)字符集必須與服務(wù)器指定字符集一致。因此,把用戶存在的問題歸納分類,產(chǎn)生漢字顯示異常的原因大致有以下幾種: ? ?
          ? ?
          ? ---- ? 1. ? 1服務(wù)器指定字符集與客戶字符集不同,而與加載數(shù)據(jù)字符集一致。 ? ?
          ? ?
          ? ---- ? 這種情況是最常見的,只要把客戶端的字符集設(shè)置正確即可,解決辦法見2.1。 ? ?
          ? ?
          ? ---- ? 1. ? 2服務(wù)器指定字符集與客戶字符集相同,與加載數(shù)據(jù)字符集不一致。 ? ?
          ? ?
          ? ---- ? 這類問題一般發(fā)生在ORACLE版本升級或重新安裝系統(tǒng)時選擇了與原來服務(wù)器端不同的字符集,而恢復加載的備份數(shù)據(jù)仍是按原字符集卸出的場合,以及加載從其它使用不同字符集的ORACLE數(shù)據(jù)庫卸出的數(shù)據(jù)的情況。這兩種情況中,不管服務(wù)器端和客戶端字符集是否一致都無法顯示漢字。解決辦法見2.2。 ? ?
          ? ?
          ? ---- ? 1.3服務(wù)器指定字符集與客戶字符集不同,與輸入數(shù)據(jù)字符集不一致。 ? ?
          ? ?
          ? ---- ? 這種情況是在客戶端與服務(wù)器端字符集不一致時,從客戶端輸入了漢字信息。輸入的這些信息即便是把客戶端字符集更改正確,也無法顯示漢字。解決辦法見2.3。 ? ?
          ? ?
          ? ---- ? 2.解決辦法 ? ?
          ? ?
          ? ---- ? 下面將分別對上述三種情況給出解決辦法。為了敘述方便,假設(shè)客戶端使用WINDOWS95/98環(huán)境,并已成功地配置了TCP/IP協(xié)議,安裝了ORACLE的sql*net,sql*pluse產(chǎn)品。 ? ?
          ? ?
          ? ---- ? 2.1 ? 設(shè)置客戶端字符集與服務(wù)器端字符集一致 ? ?
          ? ?
          ? ---- ? 假設(shè)當前服務(wù)器端使用US7ASCII字符集。 ? ?
          ? ?
          ? ---- ? (1)查看服務(wù)器端字符集 ? ?
          ? ?
          ? ---- ? 通過客戶端或服務(wù)器端的sql*plus登錄ORACLE的一個合法用戶,執(zhí)行下列SQL語句: ? ?
          ? ?
          ?   ? SQL ? > ? select ? * ? from ? V$NLS_PARAMETERS ? ?
          ? parameter            value ?
          ? NLS_LANGUAGE          ? AMERICAN ?
          ? NLS_TERRITORY         AMERICA ?
          ? ….               ? …. ?
          ? NLS_CHARACTERSET        ? US7ASCII ?
          ? NLS_SORT            ? BINARY ?
          ? NLS_NCHAR_CHARACTERSET     ? US7ASCII ?
          ? ?
          ? ---- ? 從上述列表信息中可看出服務(wù)器端ORACLE數(shù)據(jù)庫的字符集為´US7ASCII´。 ? ?
          ? ?
          ? ---- ? (2)按照服務(wù)器端字符集對客戶端進行配置 ? ?
          ? ?
          ? ---- ? 配置方法有兩種: ? ?
          ? ?
          ? 安裝ORACLE的客戶端軟件時指定 ?
          ? ---- ? 在安裝ORACLE的客戶端產(chǎn)品軟件時,選擇與ORACLE服務(wù)端一致的字符集(本例為US7ASCII)即可。 ? ?
          ? ?
          ? 修改注冊信息的方法 ?
          ? ---- ? 根據(jù)ORACLE ? 客戶端所選sql*net ? 的版本分為下列兩種情況: ? ?
          ? ?
          ? ---- ? a. ? 客戶端為 ? sql*net ? 2.0 ? 以下版本 ? ?
          ? ?
          ? ---- ? 進入Windows的系統(tǒng)目錄,編輯oracle.ini文件,用US7ASCII替換原字符集,重新啟動計算機,設(shè)置生效。 ? ?
          ? ?
          ? ---- ? b. ? 客戶端為 ? sql*net ? 2.0 ? 以上版本 ? ?
          ? ?
          ? ---- ? 在WIN98 ? 下 ? 運 ? 行REGEDIT,第一步選HKEY_LOCAL_MACHINE,第二步選擇SOFTWARE, ? 第三步選擇 ? ORACLE, ? 第四步選擇 ? NLS_LANG, ? 鍵 ? 入 ? 與服 ? 務(wù) ? 器 ? 端 ? 相 ? 同 ? 的 ? 字 ? 符 ? 集(本例為:AMERICAN_AMERICAN.US7ASCII)。 ? ?
          ? ?
          ? ---- ? 2.2 ? 強制加載數(shù)據(jù)字符集與服務(wù)器端字符集一致 ? ?
          ? ?
          ? ---- ? 假設(shè)要加載數(shù)據(jù)從原ORACLE數(shù)據(jù)庫卸出時的字符集為US7ASCII,當前ORACLE服務(wù)器字符集為WE8ISO8859P1。 ? ?
          ? ?
          ? ---- ? 下面提供三種解決方法: ? ?
          ? ?
          ? ---- ? (1) ? 服務(wù)器端重新安裝ORACLE ? ?
          ? ?
          ? ---- ? 在重新安裝ORACLE ? 時選擇與原卸出數(shù)據(jù)一致的字符集(本例為US7ASCII)。 ? ?
          ? ?
          ? ---- ? 加載原卸出的數(shù)據(jù)。 ? ?
          ? ?
          ? ---- ? 這種情況僅僅使用于空庫和具有同一種字符集的數(shù)據(jù)。 ? ?
          ? ?
          ? ---- ? (2)強行修改服務(wù)器端ORACLE當前字符集 ? ?
          ? ?
          ? ---- ? 在用imp命令加載數(shù)據(jù)前,先在客戶端用sql*plus登錄system ? DBA用戶,執(zhí)行下列SQL語句進行當前ORACLE數(shù)據(jù)庫字符集修改: ? ?
          ? ?
          ? SQL ? > ? create ? database character ? set ? US7ASCII ?
          ? * ? create ? database ? character ? set ? US7ASCII ?
          ?    ERROR ? at ? line ? 1: ?
          ? ORA-01031: ? insufficient ? privileges ?
          ? ?
          ? ---- ? 你會發(fā)現(xiàn)語句執(zhí)行過程中,出現(xiàn)上述錯誤提示信息,此時不用理會,實際上ORACLE數(shù)據(jù)庫的字符集已被強行修改為US7ASCII,接著用imp命令裝載數(shù)據(jù)。等數(shù)據(jù)裝載完成以后,shutdown ? 數(shù)據(jù)庫,再startup ? 數(shù)據(jù)庫,用合法用戶登錄ORACLE數(shù)據(jù)庫,在sql>命令提示符下,運行select ? * ? from ? V$NLS_PARAMETERS,可以看到ORACLE數(shù)據(jù)庫字符集已復原,這時再查看有漢字字符數(shù)據(jù)的表時,漢字已能被正確顯示。 ? ?
          ? ?
          ? ---- ? (3)利用數(shù)據(jù)格式轉(zhuǎn)儲,避開字符集限制 ? ?
          ? ?
          ? ---- ? 這種方法主要用于加載外來ORACLE數(shù)據(jù)庫的不同字符集數(shù)據(jù)。其方法如下: ? ?
          ? ?
          ? ---- ? 先將數(shù)據(jù)加載到具有相同字符集的服務(wù)器上,然后用轉(zhuǎn)換工具卸出為foxbase ? 格式或access格式數(shù)據(jù)庫,再用轉(zhuǎn)換工具轉(zhuǎn)入到不同字符集的ORACLE數(shù)據(jù)庫中,這樣就避免了ORACLE字符集的困擾。目前數(shù)據(jù)庫格式轉(zhuǎn)換的工具很多,象power ? builder5.0以上版本提供的pipeline,Microsoft ? Access數(shù)據(jù)庫提供的數(shù)據(jù)導入/導出功能等。轉(zhuǎn)換方法參見有關(guān)資料說明。. ? ?
          ? ?
          ? ---- ? 2.3匹配字符集替換漢字 ? ?
          ? ?
          ? ---- ? 對于1.3提到的情況,沒有很好的辦法,只能先把客戶端與服務(wù)器端字符集匹配一致后,根據(jù)原輸入漢字的特征碼替換漢字字符部分。 ??
          posted on 2007-03-26 17:49 飛鳥 閱讀(732) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
          主站蜘蛛池模板: 宁陵县| 尼玛县| 万州区| 保定市| 彩票| 屯昌县| 无极县| 安龙县| 无棣县| 朔州市| 松江区| 都江堰市| 芜湖市| 石狮市| 金川县| 康马县| 辽阳县| 宁武县| 长乐市| 清丰县| 岳西县| 伊金霍洛旗| 乌拉特中旗| 峨边| 泰和县| 紫云| 德昌县| 梨树县| 留坝县| 玉山县| 乃东县| 顺昌县| 安新县| 安丘市| 贺州市| 寿阳县| 法库县| 宝鸡市| 天气| 丰城市| 夏津县|