Oracle中字符串大小比较以及数据隐式转化

发表于:2018-1-16 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Awesome_Tang    来源:简书

  首先我们得明白在数据库中单引号是用来字符串引用的,不管是数字还是时间,当你用单引号引用起来之后,数据库就会将他当成字符串来对待。
  我们先看下面两个语句:
  select from users where age > 30
  select from users where age > ’30’
  其中age字段是varchar格式,全部都是数字,不要问我既然都是数字的为什么不用num类型。
  当两个语句执行的时候,发现第一个语句能准确的筛选出我们想要的结果,第二个语句虽然也可以执行,但筛选出来的结果中age比30小的也出现了。
  这时候我们疑问就来了,按理来说,第二个应该才是正确的写法,为什么第二个反而得不到我们想要的结果,第一个却可以呢?
  首先我们先看第一个问题:
  select * from users where age > ’30’
  当30加上单引号,其实就变成了两个字符串之间比较大小了。
  假如有一条age的值为4,当数据库将’4’和’30’来比较大小的时候,第一步会用空格补全位数,实际比较的是’4 ’和’30’,然后从左至右依次比较ascii码大小,4的ascii码是52,3的ascii码是51,所以’4’就比’30’大了,也就出现在我们的筛选结果中了
  如果比较的是’3’和’30’,同样的也会先去补全位数,第一位都是3然后比较第二位,第二位空格的ascii码32,0的ascii码是48,因此’3’就比’30’小了,好像没毛病,不过我们得明白其中的道理。
  梳理下规则
  1.用空格补全字符长度短的一方;
  2.从左至右依次比较ascii码的大小
  第二个问题:
  第二个问题涉及到了数据隐式转换。
  在oracle中,如果不同的数据类型之间关联,如果不显式转换数据,则它会根据以下规则对数据进行隐式转换。
  什么意思呢,我们看上面的例子,age为varchar类型时,30为num类型,当我们执行select * from users where age > 30的时候,oracle会把age的数据类型隐式转换为num型,上面的语句其实等同于select * from users where to_number(age) > 30数字类型比较大小,当然就没问题了,所以筛选出的结果就是我们期望看到的了;
  当然如果age字段里面有不能to_number的值,例如里面有一条记录age是’二十八’,那么上面的语句就会报错了。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号