zoukankan      html  css  js  c++  java
  • SQLServer中比较末尾带有空格的字符串遇到的坑(转)

    http://www.cnblogs.com/happycat1988/p/4779805.html

    最近发现SQLServer中比较字符串的时候 如果字符串末尾是空格 那么SQLServer会无视那些空格直接进行比较 这和程序中平时的字符串判断逻辑不统一

    复制代码
    declare @a nvarchar(50);set @a=N'happycat1988'  
    declare @b nvarchar(50);set @b=N'happycat1988 '  
    
    if(@a = @b)  
        select 'True' as 直接等号比较
    else  
        select 'False' as 直接等号比较
        
        
    if(@a like @b)  
        select 'True' as like比较
    else  
        select 'False' as like比较
    复制代码

    以上查询执行后的结果如下

    复制代码
    直接等号比较
    ------
    True
    
    (1 行受影响)
    
    like比较
    ------
    False
    
    (1 行受影响)
    复制代码

    从上面可以看出 直接等号判断的时候 SQL会无视末尾的空格 但是like却能够正确的比较 虽然用like也是一种方法 不过如果带有%之类的或许会判断错误 不能单单只用like一个判断 不过反正都是要附加一个条件了 有没有什么比like还简单的呢 于是我就想到了用len函数加上字符串长度同时比较 然后就踩了另外一个坑

    declare @a nvarchar(50);set @a=N'happycat1988'  
    declare @b nvarchar(50);set @b=N'happycat1988 '  
    
    select len(@a) 'len of a' ,len(@b) 'len of b' ,datalength(@a) 'datalength of a' ,datalength(@b) 'datalength of b'

    以上查询执行后的结果如下

    len of a    len of b    datalength of a datalength of b
    ----------- ----------- --------------- ---------------
    12          12          24              26
    
    (1 行受影响)

    可以看到len函数也是无视末尾空格的 只有用datalength函数才能作为附加的精确判断的依据

    查询了MSDN(LEN (Transact-SQL)) 发现len函数的说明是"Returns the number of characters of the specified string expression, excluding trailing blanks." 也就是排除空格比较的 所以要换用datalength

    于是乎整理出了一些精确判断字符串的方法

    复制代码
    declare @a nvarchar(50);set @a=N'happycat1988'  
    declare @b nvarchar(50);set @b=N'happycat1988 '  
    
    
    if(@a = @b and datalength(@a)=datalength(@b))  
        select 'True' as 配合datalength比较  
    else   
        select 'False' as 配合datalength比较   
        
    if(@a = @b and @a like @b and @b like @a)  
        select 'True' as 配合like比较 
    else   
        select 'False' as 配合like比较 
        
    if(@a + 'a' = @b + 'a')  
        select 'True' as 末尾补充字符比较  
    else   
        select 'False' as 末尾补充字符比较  
    复制代码

    以上查询执行后的结果如下

    复制代码
    配合datalength比较
    --------------
    False
    
    (1 行受影响)
    
    配合like比较
    --------
    False
    
    (1 行受影响)
    
    末尾补充字符比较
    --------
    False
    
    (1 行受影响)
    复制代码

    希望能够帮到同样踩坑的朋友

  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/junkai/p/6349112.html
Copyright © 2011-2022 走看看