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


最近發現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 行受影響)

 

希望能夠幫到同樣踩坑的朋友


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM