如果
select 1 where 'a '='a       '
结果也是1,这可能说明了把它当场了varchar类型,后面的空格被忽略了

解决方案 »

  1.   

    很简单,sql server会砍掉右端的空格,左端的不会也就是做了rtrim()
      

  2.   

    是好奇怪呀
    declare @a varchar(200),@b varchar(200)
    set @a='a'
    set @b='a              'select len(@a),len(@b),@b+@aselect 1 where @a=@b
    godeclare @a char(200),@b char(200)
    set @a='a'
    set @b='a              'select len(@a),len(@b)select 1 where @a=@b
    /*
    结果:1           1           a              a(所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)                        
    ----------- ----------- 
    1           1(所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)*/
      

  3.   

    那是因为SQL SERVER进行了隐式转换,把后面的空格去掉了
      

  4.   

    to:cloudchen(cloudchen) 
    那也不对呀,我的例子中 select len(@a),len(@b),@b+@a,@b+@a的值是有空格的,这说明没有rtrim(),要不是在判断的时候做rtrim()?
      

  5.   

    很简单,sql server会砍掉右端的空格,左端的不会也就是做了rtrim()==>显然这个说法,我认为是错误的。
    照这样的说法,rtrim函数也就没有存在的必要了。
    see:
    select 1 where ' a '='        a'
    select 1 where ' a'='   a'
    都没有得到结果,显然SQL Server知道它该做什么。
      

  6.   

    to pbsql(风云) 
    "那是因为SQL SERVER进行了隐式转换,把后面的空格去掉了"比较赞同pbsql(风云) 的观点,sql server在比较串大小的时候,可能首先要保证两者相同长度,sql server采取了以左边的expression为标准。
      

  7.   

    但是,我比较难以理解的是
    select  len('a '),len('a             ')
    的结果竟然是
                            
    ----------- ----------- 
    1           1
      

  8.   

    楼主的
    select 1 where ' a '='        a'
    select 1 where ' a'='   a'
    没有结果,因为就是rtrim()了,也不等,所以不满足条件
    改成
    select 1 where ' a '=' a       '
    或者
    select 1 where '  a '='  a       '
    就有结果了,不知道对不对/
      

  9.   

    联机帮助上查到
    LEN()
    返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。汗颜,看来帮助还是要看仔细。
      

  10.   

    sql的特点嘛,没有什么奇怪的.
      

  11.   

    select  len('a '),len('a             ')其实这样做更有意义,设想是在一个char(50)的知道内,如果用len()函数获取字符串长度的时候不砍掉右面的空格,这样每行的长度都是50了,根本没法获得它的实际字符串的长度
      

  12.   

    是呀,为了考虑到char,显然len是必须要这么做的。