不依赖字符集的数据库非标字段检测方法
孟凡奇;赵雷
【摘 要】为了能够便捷、准确地从数据库中检测出含有特殊符号、中文文字等不属于ASCII字符集的非标准字符的字段,提出两种不依赖于数据库所用字符集的含非标字符字段的检测方法,第一种方法通过比较疑似非标字段的文字长度与存储长度,若不相等则为非标字段;第二种方法将疑似非标字段转换为ASCII,然后比较转换前后的值,若不相同则为非标字段。实验结果表明,与传统依赖于字符集的非标字段检查方法相比,第一种方法在执行效率上略优于传统方法,而第二种方法则稍劣于传统方法,但差距并不明显,且由于DBA无需掌握字符集,相对减轻了检测负担,整体性能优于传统方法。%Most invalid number of database including specific symbols or Chinese characters which are not included in ASCII Character Set. These invalid data fields may bring unexpected risk to MIS or data migration. Address the problem, the paper proposed two detection methods of database nonstandard field Independent of Character Set. The one converts the field to ASCII and then compares the values between before and after. Another compares the byte length and word length. All the two methods detected all of
nonstandard fields in the data table. The methods afford new effective measures to detecting and correcting invalid number in database.
【期刊名称】《东北电力大学学报》
【年(卷),期】2012(032)004
【总页数】4页(P4-7)
【关键词】数据库;字符集;特殊符号;检测
【作 者】孟凡奇;赵雷
【作者单位】东北电力大学信息工程学院,吉林吉林132012;大庆油田电力集团油田热电厂,黑龙江大庆163314
【正文语种】中 文
【中图分类】TP311.13
信息社会的绝大多数信息是存储在MIS(Management Information System,管理信息系统)中的,而MIS中真正存储数据的是数据库,人们从数据库中获取信息,同时也将新的信息录入数据库。因此,数据库中的数据是否规范、正确就显得尤为重要[1]。但是由于主观故意或是数据录入时的合法性检测不严格等诸多原因,数据库中难免出现少量非法数据。比如,的格式应为“邮箱名@域名”,录入“****************”是正确的、合法的,而“★☆*@7#”就是不正确的地址,可以定义为“非法”数据。这些非法数据的显著特征之一就是含有非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表的结构序号 字段名称 字段类型 长度 序号 字段名称 字段类型 长度1 OWNER VARCHAR2 30 9 TIMESTAMP VARCHAR2 19 2 OBJECT_NAME VARCHAR2 128 10 STATUS VARCHAR2 7 3 SUBOBJECT_NAME VARCHAR2 30 11 TEMPORARY VARCHAR2 1 4 OBJECT_ID NUMBER 22 12 GENERATED VARCHAR2 1 5 DATA_OBJECT_ID NUMBER 22 13 SECONDARY VARCHAR2 1 6 OBJECT_TYPE VARCHAR2 19 14 NAMESPACE NUMBER 22 7 CREATED DATE 7 15 EDITION_NAME VARCHAR2 30 8 LAST_DDL_TIME DATE 7

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。