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

率先大家得清楚在数据库中单引号是用来字符串引用的,不管是数字依旧时间,当您用单引号引用起来以往,数据库就会将她真是字符串来对待。


Oracle,大家先看下边七个语句:

select from users where age > 30
select from users where age > ’30’

内部age字段是varchar格式,全体都是数字,不要问小编既是都以数字的干什么不要num类型。

当四个语句执行的时候,发现第②个语句能确切的筛选出我们想要的结果,第二个语句纵然也能够实施,但筛选出来的结果中age比30小的也应运而生了。

此刻我们疑问就来了,按理来说,第③个应该才是情有可原的写法,为啥第3个反而得不到大家想要的结果,第2个却得以呢?

首先我们先看率先个难点:

select * from users where age > ’30’

当30拉长单引号,其实就改为了多个字符串之间比较大小了。

假若有一条age的值为4,当数据库将’4’和’30’来相比较大小的时候,第1步会用空格补全位数,实际比较的是’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是’二十八’,那么地点的口舌就会报错了。


peace~

相关文章