iT邦幫忙

7

MSSQL 函數Len的計算漏洞

我今天遇到一個問題,接到Bug報告處理@@..

說人數計算有問題~

我用眼看後,想說為何明明是4個人,卻會帶出5的數字
舉例:

declare @Str1 nvarchar(50)
declare @Str2 nvarchar(50)
set @Str1 = 'AAA ,BBB ,CCC ,EEE,'
set @Str2 = 'DDD ,KKK ,XXX ,EEE ,'

select len(@Str1) - len(replace(@Str1,',','')) Num1
,len(@Str2) - len(replace(@Str2,',','')) Num2

結果
https://ithelp.ithome.com.tw/upload/images/20180719/20061369r01uKHL2w1.png

後來為了查詢Len判斷空白問題,特別列出來,原來Len會將最右邊的空白捨棄掉@@..
舉例:

declare @Str3 nvarchar(50)
declare @Str4 nvarchar(50)
set @Str3 = '  '
set @Str4 = ' , '
select len(@Str3) Num3,len(@Str4) Num4

結果
https://ithelp.ithome.com.tw/upload/images/20180719/200613696BTmtpOZqe.png

所以為了避免奇怪的空白問題,就先把空白都取代掉再來判斷
舉例:

select len(replace(@Str1,' ','')) - len(replace(replace(@Str1,' ',''),',','')) Num1
,len(replace(@Str2,' ','')) - len(replace(replace(@Str2,' ',''),',','')) Num2

結果
https://ithelp.ithome.com.tw/upload/images/20180719/20061369mfcOBqoZM9.png

這樣人數就正確了

關於那個空白是人為key的,並不是透過程式加上的~


2 則留言

6
蠻牛
iT邦新手 5 級 ‧ 2018-07-19 13:31:12

那是MSSQL varchar及nvarchar的規範,會自動去最後面字元右邊的所有空白

https://ithelp.ithome.com.tw/upload/images/20180719/20110705BlMyrpnobo.png

暐翰 iT邦大師 7 級‧ 2018-07-19 13:50:05 檢舉

學習了 /images/emoticon/emoticon41.gif

純真的人 iT邦研究生 1 級‧ 2018-07-19 13:58:30 檢舉

原來如此~
想說MySQL的Length函數,可以正確計算呢@@
還是有些微差異~

0
神Q超人
iT邦新手 2 級 ‧ 2018-07-20 21:33:36

這也是一個如果沒有遇到就不會發現的豆知識XD

我要留言

立即登入留言