验证数据在Oracle中的存储

来源:互联网 发布:奇葩搞笑淘宝买家秀 编辑:程序博客网 时间:2024/06/03 22:43

做软件测试,常常需要验证数据在数据库中是否按照指定的字符集正确存储。常规的做法是用客户端查询,检查显示是否正常,这种做法是不正确的。

以Oracle为例,谈到字符集有三个概念,客户端字符集、数据库字符集和NLS_LANG字符集。写入数据的时候,Oracle将客户端提交的数据按照NLS_LANG的字符集转换为数据库字符集进行存储;而读出的时候,Oracle将数据转换为NLS_LANG的字符集进行输出。

据个例子,假设客户端字符集为GBK,NLS_LANG字符集为UTF-8,Oracle字符集也是UTF-8,这样数据入库的时候Oracle将不对数据的编码进行转换,致使UTF8的数据库中实际存储的是GBK的数据;而出库的时候,Oracle同样不进行转换,致使我们在客户端依然能够看到显示正常的数据。所以我们如果用客户端来做这个测试,就发现不了问题。

就这个例子本身来说,NLS_LANG的字符集也应该设置为GBK,这样整个过程就正确了。当然,说这个有点悖离这篇文章的初衷了。这篇文章的初衷是要介绍一个简单的测试方法。

测试这类问题时,最简单的方法莫过于使用Oracle的dump函数,这样可以直接看到数据在数据库中存储的编码。假设数据库URLContent编码为UTF-8,我们希望验证URLTitle这个字段存储的方式是否正确,就可以这么办:

select dump(URLTitle, 16) from URLContent where URLName like '%8974194%';

其中“where URLName like '%8974194%'”是为了使输出结果唯一。

检索结果输出:

DUMP(URLTITLE,16)
--------------------------------------------------------------------------------

Typ=1 Len=36: e5,ae,b6,e7,94,b5,e4,b8,8b,e4,b9,a1,e8,9b,8b,e7,b3,95,e5,86,9c,e6,

b0,91,e8,bf,98,e9,9a,be,e5,90,83,e5,88,b0

是十六进制的编码序列,接下来我们只需要借助其它工具,如UltraEdit获取字符串“家电下乡蛋糕农民还难迟到”的UTF8编码序列,将两者对比获取对比结果就可以了。