SQLServer中比較末尾帶有空格的字符串遇到的坑

最近發現SQLServer中比較字符串的時候 若是字符串末尾是空格 那麼SQLServer會無視那些空格直接進行比較 這和程序中平時的字符串判斷邏輯不統一sql

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比較

以上查詢執行後的結果以下express

直接等號比較
------
True

(1 行受影響)

like比較
------
False

(1 行受影響)

從上面能夠看出 直接等號判斷的時候 SQL會無視末尾的空格 可是like卻可以正確的比較 雖然用like也是一種方法 不過若是帶有%之類的或許會判斷錯誤 不能單單隻用like一個判斷 不過反正都是要附加一個條件了 有沒有什麼比like還簡單的呢 因而我就想到了用len函數加上字符串長度同時比較 而後就踩了另一個坑app

 

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函數才能做爲附加的精確判斷的依據spa

查詢了MSDN(LEN (Transact-SQL)) 發現len函數的說明是"Returns the number of characters of the specified string expression, excluding trailing blanks." 也就是排除空格比較的 因此要換用datalengthcode

 

因而乎整理出了一些精確判斷字符串的方法blog

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 末尾補充字符比較  

以上查詢執行後的結果以下ci

配合datalength比較
--------------
False

(1 行受影響)

配合like比較
--------
False

(1 行受影響)

末尾補充字符比較
--------
False

(1 行受影響)

 

但願可以幫到一樣踩坑的朋友字符串

相關文章
相關標籤/搜索