不依赖字符集的数据库非标字段检测方法

2012-06-13 02:09孟凡奇
东北电力大学学报 2012年4期
关键词:存储空间非标字段

孟凡奇,赵 雷

(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值和存储空间角度,提出了两种不依赖字符集的数据库非标字段检测方法,实验表明,这两种方法与依赖于数据库所用字符集的非标字段检测方法取得了同样的效果。

1 基于字符集的检测方法

字符是各种文字和符号的总称,包括数字、标点符号、图形符号、各国文字等。计算机要准确识别、存储和处理各种字符,需要对其进行编码[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]。

2 不依赖字符集的检测方法

依赖于字符集的检测方法加重了DBA的负担,考虑到ASCII字符使用1个字节的存储空间,而非标字符使用2~3个字节的存储空间,同时非ASCII字符集中的非标字符在转换为ASCII时会发生改变[11-12],因此提出两种不依赖字符集的非标字段检测方法。

2.1 基于长度对比的检测方法

数据库中字段的物理存储空间和字段的逻辑长度是不同的概念。存储空间是字段占用的字节数,逻辑长度是字段中字的个数。若字段中不含非标字符,那么二者是相等的,否则不相等。仍以Oracle11g数据库为例,函数LENGTH(char)可计算字段的逻辑长度,函数LENGTHB(char)能计算字段的存储空间,例如以下两条查询语句:

语句(1)执行后的返回结果为2,语句(2)执行后的返回结果为4。若要判断“e_mail”字段是否含有非标数据可以使用条件“length(e_mail)<>lengthb(e_mail)”进行判断,若执行结果为TRUE,说明该条记录的“e_mail”字段数据的逻辑长度与存储长度不相等,则“e_mail”字段必是非标字段。由于这种方法在使用时无需指定字符集,因此对于DBA而言是不依赖字符集的。

2.2 基于取ASCII值的检测方法

将非标字符强制转换为ASCII时,其值会发生变化,这是由字符集的编码规则决定的。在Oracle11g数据库中,函数ASCIISTR(char)可以计算字段的ASCII值。比如以下两条查询语句:

语句(3)执行后的返回结果为“〈FD8·97D”,语句(4)执行后的返回结果仍将会是“abc”。根据这一特性,可以判断取值前后的字段值是否相同,不相同则必是非标字段。若判断“e_mail”字段是否含有非标数据可以使用条件“e_mail<>asciistr(e_mail)”进行判断,若结果为TRUE,说明该条记录的“e_mail”字段数据转换前后并不相同,则“e_mail”字段必是非标字段。此方法也无需指定字符集,因此对于DBA而言也是不依赖字符集的。

3 实验及结果

数据库服务器采用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 测试语句的查询结果(部分)

4 结 论

本文提出的两种不依赖字符集的非标字段检测方法与目前大多数依赖于字符集的检测方法在性能上没有明显差别,同样检测到了含有中文、特殊符号等非标字符的记录。但与传统方法相比,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.

猜你喜欢
存储空间非标字段
非标设备制造质量控制计划的编制和实施
图书馆中文图书编目外包数据质量控制分析
基于多种群协同进化算法的数据并行聚类算法
苹果订阅捆绑服务Apple One正式上线
用好Windows 10保留的存储空间
非标压力容器报价快速估算方法探讨
非标项目外协采购加权综合打分法实践研究
顶盖后横梁非标斜楔模具设计
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述