最近發現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 行受影響)
但願可以幫到一樣踩坑的朋友字符串