莫佩宏,吳紫薇
(中車長春軌道客車股份有限公司,長春 130062)
.Net框架聯(lián)合Oracle字符集問題研究
莫佩宏,吳紫薇
(中車長春軌道客車股份有限公司,長春 130062)
本文通過大型國企軟件應用中發(fā)現(xiàn)的漢字生僻字無法顯示問題,從開發(fā)工具到系統(tǒng)配置及數據庫連接方式等方面對問題發(fā)生的原因進行了全方位的剖析,最終找到以升級Oracle數據庫字符集為最終解決方案,并對數據庫字符集升級方式進行了全面測試,明確解決問題辦法,并在實際工作中進行了實踐,為企業(yè)級Oracle數據庫的跨字符集升遷提供了良好的實踐經驗。
漢字;生僻字;配置;數據庫;字符集
中車長春軌道客車股份有限公司于1992開始使用Oracle數據庫,應用系統(tǒng)早期開發(fā)工具一直使用Oracle產品提供的Developer2000,隨著網絡技術的發(fā)展,ASP、JSP等成為主要應用語言。最早自行開發(fā)的應用系統(tǒng)是人力資源管理系統(tǒng),其中,各模塊的開發(fā)語言主要使用Developer2000,PB和ASP等。
隨著企業(yè)經營管理理念的不斷提升和信息化技術的迅猛發(fā)展,2013年,我們從全局出發(fā),推行一體化概念。在這個思想的影響下,開始使用UCML企業(yè)級快速應用開發(fā)平臺,該平臺基于.Net框架、C#語言,標準程度高,規(guī)范性強,軟件開發(fā)方便快捷,開發(fā)效率大大提高。作為引導項目,選擇了管理模式最為穩(wěn)定的人力資源管理系統(tǒng)進行再次開發(fā),數據庫采用原有的Oracle數據庫。
人力資源管理系統(tǒng)的數據大多與個人信息有關,表現(xiàn)最為明顯的就是員工姓名,其中,涉及很多日常比較少見的生僻字。在此次人力資源系統(tǒng)整合升級的過程中發(fā)現(xiàn),在顯示員工姓名時,有些生僻字在系統(tǒng)中出現(xiàn)亂碼,這個問題雖然不是很大,但是卻直接影響著系統(tǒng)的使用性能,如果不能解決,會導致系統(tǒng)無法使用。
1.1 從編程語言方面分析
1.1.1 配置編程語言中的字符編碼
字符編碼也稱字集碼,是把字符集中的字符編碼為指定集合中某一對象,以便文本在計算機中存儲和傳遞。常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII。在使用的編程語言中,一般都會引用一套字符編碼來解決文本轉換問題。
我們使用的快速開發(fā)平臺中配置文件中的字符編碼為“UTF8”,此編碼方式為目前主流的編碼配置,可以根據不同的符號自動選擇編碼的長短。正常情況下可以滿足大部分網頁情況,但是,為了嘗試解決漢字亂碼問題,先后更換“GB2312”和“GBK”等專門針對簡體中文字符的編碼和擴展編碼方式,都沒有達到預期效果。
1.1.2 更換數據庫連接方式
程序中數據庫連接方式決定著不同的數據讀取方式和轉換方式,可能會導致特殊字符在轉換過程中出現(xiàn)問題,因此在程序中嘗試逐一更換幾種目前主流的數據庫連接方式。
(1)OracleClient方式
引用類庫:System.Data.OracleClient.dll。
命名空間:System.Data.OracleClient。
連接字符串:“data source=oratest;user id=scott;password=tiger”
(2)OleDb方式
命名空間:System.Data.OleDb。
連接字符串:與OracleClient方式相比,要添加一個provider,微軟為“provider=MSDAORA.1;”或“provider=MSDAORA”,Oracle為“provider='Ora-OleDb.Oracle';”。
(3)Oracle 提供的Oracle Data Provider for .NET(ODP.net)方式
引用類庫:Oracle.DataAccesss.dll
命名空間:Oracle.DataAccess.Client和Oracle.DataAccess.Types
連接字符串:和OleDb方式格式相同,只是provider換為 “Provider=OraOLEDB.Oracle.1”
結果表明,無法正確顯示員工姓名中生僻字。
1.2 從框架方面分析
針對人力資源系統(tǒng),從2003年開始,我們使用ASP網絡語言開發(fā)了一系列應用模塊,都沒有發(fā)現(xiàn)有姓名生僻字無法顯示的問題,而此次使用.Net框架卻出現(xiàn)顯示亂碼問題,分析可能是由于數據讀取解析方式不同造成的。
對比ASP這種前端解析開發(fā)語言,考慮.Net是否在框架方面有什么參數可配置,因此咨詢微軟支持工程師,對方表示到目前為止,微軟方面沒有這方面的配置。
1.3 從數據庫方面分析
從1992年Oracle6版本開始引入應用,一直到現(xiàn)在,Oracle數據庫版本已經升級為11 G,持續(xù)應用超過20年。雖然Oracle技術日新月異,但是由于引入的時間比較早,是Oracle針對中文配置字符集的初期,數據庫字符集設置為ZHS16CGB231280。
1.3.1 數據庫客戶端字符集配置一致性問題
聯(lián)合數據庫連接方式的改變,因為其中提到的前兩種連接方式都是需要.Net程序發(fā)布服務器配置Oracle Client程序的,這就涉及到客戶端的字符集是否與數據庫服務器端字符集匹配的問題。將.Net程序發(fā)布服務器上的數據庫客戶端字符集通過注冊表和環(huán)境變量(NLS_LANG)兩種方式配置成與數據庫服務器字符集相同,卻依然無法正常顯示生僻字。
1.3.2 數據庫服務器字符集問題
數據庫服務器字符集為ZHS16CGB231280,查找相關使用手冊,了解到該字符集只涵蓋常用漢字7 000多個,一般的生僻字都是不包括在內的。在后期升級Oracle版本時考慮升級字符集,但是由于Oracle數據庫的特殊性,其字符集修改必須滿足新字符集是老字符集的超集(當一種字符集A的編碼數值包含所有另一種字符集B的編碼數值,并且兩種字符集相同編碼數值代表相同的字符時,則字符集A是字符集B的超級,或稱字符集B是字符集A的子集)才可以修改,而后期出現(xiàn)的ZHS16GBK字符集雖囊括了近萬的漢字,卻無法保證是原字符集的超集,字符集的修改或轉換有可能帶來數據的丟失,存在很多不可預見的風險,因此在近20年的Oracle使用中,我們始終沿用了ZHS16CGB231280漢字字符集。
1.4 問題定位
綜上所有測試結果,如果維持現(xiàn)有使用的工具和框架,唯一的解決方案就是針對數據庫字符集進行升遷,將其字符集升遷至更大的漢字字符集,即ZHS16GBK。
2.1 安裝配置新字符集下的Oracle數據庫服務器
安裝配置一臺新的Oracle數據庫服務器,在創(chuàng)建數據庫時,可以指定字符集(CHARACTER SET)和國家字符集(NATIONAL CHARACTER SET)。數據庫字符集是指以什么編碼格式用來存儲CHAR,VARCHAR2,CLOB,LONG等類型數據,用來標示諸如表名、列名以及PL/SQL變量,存儲SQL和PL/SQL程序單元等,新的服務器配置指定字符集為ZHS16GBK,幾乎涵蓋目前為止最多的漢字生僻字;國家字符集用于存儲NCHAR,NVARCHAR2,NCLOB等類型數據,國家字符集實質上是為Oracle選擇的附加字符集,主要作用是為了增強Oracle的字符處理能力,因為NCHAR數據類型可以提供對亞洲使用定長多字節(jié)編碼的支持,而數據庫字符集則不能。國家字符集在Oracle9i中進行了重新定義,只能在unicode編碼中的AF16UTF16和UTF8中選擇,默認值是AF16UTF16,新的服務器配置選擇默認值。
2.2 數據遷移
新整合的人力資源系統(tǒng)基于新的數據庫服務器搭建,但原始數據需要無缺陷地進行遷移,遷移至新的數據庫服務器。
2.2.1 Exp/Imp方式
(1)嘗試在數據庫服務器端使用Exp方式進行數據導出;(2)通過Imp方式進行數據導入,這種方式在導入導出期間做了字符集轉換,但是通過對Dmp文件中的頭文件分析,發(fā)現(xiàn)有數據丟失現(xiàn)象。在新導入的數據中,不但生僻字為亂碼,同時正常的中文注釋以及視圖、存儲過程等中存在的一些漢字代碼也丟失變?yōu)閬y碼,導致視圖和存儲過程等失效。(3)我們使用客戶端導入導出,導出時將客戶端與源服務器端字符集配置一致,導入時使客戶端與目標服務器端字符集配置一致,結果顯示由于Dmp文件的頭文件格式不同,無法實現(xiàn)導入過程。
2.2.2 數據泵Expdp/impdp方式
數據泵導出通常保存數據為與數據來源的數據庫相同的字符集。數據泵導入時轉換數據為目標數據庫的字符集。在數據庫會話啟動之后,數據泵日志文件以NLS_LANG指定的語言寫入。利用數據泵對用戶進行數據導入后暫時沒有發(fā)現(xiàn)其他問題,只是生僻字有顯示亂碼問題,通過客戶端和電子表格等結合方式,在目標數據庫中將生僻字進行統(tǒng)一修改,基本實現(xiàn)了數據遷移任務。
通過對人力資源管理系統(tǒng)進行再次開發(fā),分析出現(xiàn)的問題及解決方案,我們可以總結如下:(1)針對.Net框架語言,由于其是微軟開發(fā)的,使用Oracle數據庫會存在一些不可預見的兼容問題;(2)對于Oracle而言,字符集的更改需要進行大量的測試工作,不斷地發(fā)現(xiàn)問題和解決問題,最終實現(xiàn)字符集升遷和數據的成功遷移。
責任編輯 陳 蓉
Analysis of Oracle character set problem under .Net frame
MO Peihong,WU Ziwei
( CRRC Changchun Railway Vehicles Co.Ltd.,Changchun 130062,China)
By software application in large state-owned enterprise,it was found that some rare used Chinese characters could not be displayed.In this text,the problem was comprehensively analyzed from aspects of tool development,system confguration,data base connection and so on.The solution was to upgrade Oracle database character set.The method of upgrading database character set was comprehensively tested to confrm the solution and check it in practice,which provided good practical experience in cross-character set upgrade of enterprise-level Oracle database.
Chinese character;rare used Chinese character;confguration;database;character set
TP392
A
1005-8451(2016)06-0043-03
2015-12-02
莫佩宏,教授級高級工程師;吳紫薇,高級工程師。