数据库是 oracle 10g
例如下面一句(等号右边的字符串含有一串空格)
select 1 from dual where 'aaaa' = 'aaaa       ' 
运行结果会有一条记录返回然而
select 1 from dual where trim('aaaa') = 'aaaa       ' 
这样就没有记录返回
同样ltrim,rtrim,substr 都有这样的现象谁能说说为什么?

解决方案 »

  1.   

    我觉得是oracle先针对'aaaa'和'aaaa     '生成了对应的类似char类型的定长字符串。
    然后作比较。
    由于char类型不足位数本身就用空格补足,所以比较的时候相等。
    相当于'aaaa        '='aaaa        '
    但是加了trim以后,情况就不同了。
    相当于'aaaa'='aaaa        '所以结果不同。
      

  2.   

    似乎是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操作
      

  3.   

    我同意doer_ljy(可战) 的观点!
    在'aaaa' = 'aaaa       ' 比较的时候,1位字长和4000个字长是相等的.
    trim则要执行截取判定了。