验证数据在Oracle中的存储

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

以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编码序列,将两者对比获取对比结果就可以了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值