萊恩
返回字串的字元數。
注意:LEN
函式忽略尾隨空格:
SELECT LEN('My string'), -- returns 9
LEN('My string '), -- returns 9
LEN(' My string') -- returns 12
如果需要包括尾隨空格的長度,則有幾種技術可以實現這一點,儘管每種技術都有其缺點。一種技巧是將單個字元附加到字串,然後使用 LEN
減去 1:
DECLARE @str varchar(100) = 'My string '
SELECT LEN(@str + 'x') - 1 -- returns 12
這樣做的缺點是,如果字串變數或列的型別具有最大長度,則會丟棄額外字元的附加,並且結果長度仍然不會計算尾隨空格。為了解決這個問題,以下修改版本解決了這個問題,並在所有情況下都給出了正確的結果,代價是少量額外的執行時間,並且因此(正確的結果,包括代理對和合理的執行速度)似乎是最好的技術:
SELECT LEN(CONVERT(NVARCHAR(MAX), @str) + 'x') - 1
另一種技術是使用 theDATALENGTH
功能。
DECLARE @str varchar(100) = 'My string '
SELECT DATALENGTH(@str) -- returns 12
重要的是要注意,雖然 DATALENGTH
返回記憶體中字串的長度(以位元組為單位)。這對於 varchar
與 nvarchar
會有所不同。
DECLARE @str nvarchar(100) = 'My string '
SELECT DATALENGTH(@str) -- returns 24
你可以通過將字串的資料長度除以單個字元的資料長度(必須是相同型別)來進行調整。下面的示例執行此操作,並且還處理目標字串恰好為空的情況,從而避免除以零。
DECLARE @str nvarchar(100) = 'My string '
SELECT DATALENGTH(@str) / DATALENGTH(LEFT(LEFT(@str, 1) + 'x', 1)) -- returns 12
但即便如此,SQL Server 2012 及更高版本也存在問題。當字串包含代理項對時,它將產生不正確的結果(某些字元可能比同一字串中的其他字元佔用更多位元組)。
另一種技術是使用 REPLACE
將空格轉換為非空格字元,並取結果的 LEN
。這在所有情況下都給出了正確的結果,但是使用長字串的執行速度非常差。