孟凡奇,趙 雷
(1.東北電力大學信息工程學院,吉林吉林132012;2.大慶油田電力集團油田熱電廠,黑龍江大慶163314)
信息社會的絕大多數信息是存儲在MIS(Management Information System,管理信息系統)中的,而MIS中真正存儲數據的是數據庫,人們從數據庫中獲取信息,同時也將新的信息錄入數據庫。因此,數據庫中的數據是否規范、正確就顯得尤為重要[1]。但是由于主觀故意或是數據錄入時的合法性檢測不嚴格等諸多原因,數據庫中難免出現少量非法數據。比如,電子郵箱的格式應為“郵箱名@域名.com”,錄入“victor@yahoo.com”是正確的、合法的,而“★☆*@7#.cn”就是不正確的電子郵箱地址,可以定義為“非法”數據。這些非法數據的顯著特征之一就是含有非ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)字符。本文將含有非ASCII字符的字段稱為“非標字段”。對于非法的非標字段除了以預防為主以外還要及時的檢查并糾正[2]。
目前,大多數檢測非標字段的方法是依賴于數據庫所用字符集的,檢測時要指定字符集名稱或使用其中的字符編碼,這就迫使DBA(Database Administrator,數據庫管理員)要對現有的字符集有一定程度的了解,增加了其額外工作量[3]。本文從數據表中字段的ASCII值和存儲空間角度,提出了兩種不依賴字符集的數據庫非標字段檢測方法,實驗表明,這兩種方法與依賴于數據庫所用字符集的非標字段檢測方法取得了同樣的效果。
字符是各種文字和符號的總稱,包括數字、標點符號、圖形符號、各國文字等。計算機要準確識別、存儲和處理各種字符,需要對其進行編碼[4-6]。由于編碼的字符數量和規則不盡相同,因此形成了不同版本的字符的集合,簡稱字符集。字符集種類較多,數據庫中常用的字符集有:ASCII字符集、GB2312字符集、BIG5字符集、Unicode字符集等。
ASCII字符集是現今最通用的單字節編碼系統,對應的國際標準為ISO646。它用7位(bits)表示一個字符,共128個字符。而國內數據庫常用的GB2312又稱為GB2312-80字符集,全稱為《信息交換用漢字編碼字符集·基本集》,是中國國家標準的簡體中文字符集。它所收錄的漢字已經覆蓋99.75%的使用頻率,一個漢字用2個字節表示。GB2312收錄簡化漢字及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共7445個圖形字符[7-9]。
不同字符集中的字符能夠互相轉換,但非標字符轉換前后可能會發生變化。以Oracle11g數據庫為例,轉換工作可由CONVERT函數完成,其格式為:

其中:“char”代表要轉換的字符串;“dest_char_set”代表目標字符集;“source_char_set”代表原字符集。
利用該函數進行非標字段檢測,需要先將疑似非標字段轉換為ASCII,然后比較轉換前后字段值是否相等,若不相等即可斷定為非標字段。但在檢測之前DBA需要了解數據庫所使用的字符集。若數據庫采用 GB2312字符集,則應將參數“dest_charset”設置為“US7ASCII”,將參數“source_charset”設置為“ZHS16CGB231280”??梢?,該方法是依賴于字符集的[10]。
依賴于字符集的檢測方法加重了DBA的負擔,考慮到ASCII字符使用1個字節的存儲空間,而非標字符使用2~3個字節的存儲空間,同時非ASCII字符集中的非標字符在轉換為ASCII時會發生改變[11-12],因此提出兩種不依賴字符集的非標字段檢測方法。
數據庫中字段的物理存儲空間和字段的邏輯長度是不同的概念。存儲空間是字段占用的字節數,邏輯長度是字段中字的個數。若字段中不含非標字符,那么二者是相等的,否則不相等。仍以Oracle11g數據庫為例,函數LENGTH(char)可計算字段的邏輯長度,函數LENGTHB(char)能計算字段的存儲空間,例如以下兩條查詢語句:

語句(1)執行后的返回結果為2,語句(2)執行后的返回結果為4。若要判斷“e_mail”字段是否含有非標數據可以使用條件“length(e_mail)<>lengthb(e_mail)”進行判斷,若執行結果為TRUE,說明該條記錄的“e_mail”字段數據的邏輯長度與存儲長度不相等,則“e_mail”字段必是非標字段。由于這種方法在使用時無需指定字符集,因此對于DBA而言是不依賴字符集的。
將非標字符強制轉換為ASCII時,其值會發生變化,這是由字符集的編碼規則決定的。在Oracle11g數據庫中,函數ASCIISTR(char)可以計算字段的ASCII值。比如以下兩條查詢語句:

語句(3)執行后的返回結果為“〈FD8·97D”,語句(4)執行后的返回結果仍將會是“abc”。根據這一特性,可以判斷取值前后的字段值是否相同,不相同則必是非標字段。若判斷“e_mail”字段是否含有非標數據可以使用條件“e_mail<>asciistr(e_mail)”進行判斷,若結果為TRUE,說明該條記錄的“e_mail”字段數據轉換前后并不相同,則“e_mail”字段必是非標字段。此方法也無需指定字符集,因此對于DBA而言也是不依賴字符集的。
數據庫服務器采用DELL Power Edge T410。以Oracle11g數據庫中dba_objests視圖為藍本,通過“create table test as select* from dba_objests”語句創建測試數據庫。Test表的結構如表1所示。

表1 Test表的結構
然后向Test表插入4條含有非標字段的記錄(如圖1所示)
重復執行“insert into test select* from test”語句,直至數據表TEST中的記錄數達到8865920條,其中包括非標字段記錄512條。考慮到Oracle的共享池等機制能夠緩存查詢結果,提高對同一個表類似查詢的速度,因此將test表復制2份,分別命名為test2和test3。3條測試語句(表2所示)及其查詢結果(圖2所示)如下:

圖1 含非標字段的4條記錄

表2 測試用例及執行時間

圖2 測試語句的查詢結果(部分)
本文提出的兩種不依賴字符集的非標字段檢測方法與目前大多數依賴于字符集的檢測方法在性能上沒有明顯差別,同樣檢測到了含有中文、特殊符號等非標字符的記錄。但與傳統方法相比,DBA無需了解數據庫所使用的字符集,相對減輕了負擔。更重要的是為及時發現并糾正非法數據,避免MIS運行風險提供了新的有效手段。
[1]龔建華.基于多全體復制的Orache數據同步研究[J].辦公自動化,2011(3):27-29.
[2]鐘小權,葉猛.Oracle數據庫的SQL語句優化[J].計算機與現代化,2011(3):124-130.
[3]閃四清,楊強.Oracle Database 10g基礎教程[M].北京:清華大學出版社,2009.
[4]孟凡奇.一種在JSP頁面上分頁顯示Oracle中記錄的方法[J].科技創新導報,2007(36):50-50.
[5]岳國華,趙靜靜.基于ORACLE數據庫的多媒體數據SQL級操作探究[J].計算機技術與發展,2011,24(4):152-155.
[6]孫風棟,閆海珍.Oracle 10g數據庫系統性能優化與調整[J].計算機技術與發展,2009,9(2):13-16.
[7]王君,祝永志.基于Oracle分布式數據庫的查詢優化[J].計算機技術與發展,2008,18(1):43-45.
[8]ZHONG Xiao-quan.Optimization of SQL Sentence for Oracle Database[J].Computer and Modernization,2011(3):124 -126,130.
[9]華連生,丁憲生,呂剛.基于Oracle的氣象數據共享系統[J].計算機應用,2010,30(2):162-164.
[10]DENG Zhong-liang,Optimizing Access to Spatial Data Based on Oracle and ArcSDE[J].Computer Engineering & Software,2011,32(2):78-80.
[11]黃勇,趙靖.一種基于分布式數據庫的關聯規則挖掘新算法[J].計算機技術與發展,2011,21(2):147-150.
[12]劉媛,涂曉東.關于外包數據庫完整性驗證的研究[J].計算機技術與發展,2011,20(5):147-149.