一个oracle字符处理函数的简单问题
数据库是 oracle 10g
例如下面一句(等号右边的字符串含有一串空格)
select 1 from dual where 'aaaa ' = 'aaaa '
运行结果会有一条记录返回
然而
select 1 from dual where trim( 'aaaa ') = 'aaaa '
这样就没有记录返回
同样ltrim,rtrim,substr 都有这样的现象
谁能说说为什么?
------解决方案--------------------trim当然是去掉空格了嘛
------解决方案--------------------我觉得是oracle先针对 'aaaa '和 'aaaa '生成了对应的类似char类型的定长字符串。
然后作比较。
由于char类型不足位数本身就用空格补足,所以比较的时候相等。
相当于 'aaaa '= 'aaaa '
但是加了trim以后,情况就不同了。
相当于 'aaaa '= 'aaaa '所以结果不同。
------解决方案--------------------似乎是oracle的bug,看了一下执行计划,
select 1 from dual where 'aaaa ' = 'aaaa '
是
SELECT STATEMENT, GOAL = CHOOSE
TABLE ACCESS FULL Object owner=SYS Object name=DUAL
而
select 1 from dual where trim( 'aaaa ') = 'aaaa '
是
SELECT STATEMENT, GOAL = CHOOSE
FILTER
TABLE ACCESS FULL Object owner=SYS Object name=DUAL
根本不存在filter操作
------解决方案--------------------我同意doer_ljy(可战) 的观点!
在 'aaaa ' = 'aaaa ' 比较的时候,1位字长和4000个字长是相等的.
trim则要执行截取判定了。