最近我len()
在查询中使用来找出查询的长度时遇到了一个问题,len()
没有计算值中的尾随空格。但datalength()
也在计算尾随空格。
这是否意味着如果我正在做一些处理值的实际长度的操作,那么我必须使用dalalength()
over len()
。
例如:如果我需要特定值的值为 10 个字符长度。即如果值为 3 个字符长度,我必须在其上附加 7 个空格。
最近我len()
在查询中使用来找出查询的长度时遇到了一个问题,len()
没有计算值中的尾随空格。但datalength()
也在计算尾随空格。
这是否意味着如果我正在做一些处理值的实际长度的操作,那么我必须使用dalalength()
over len()
。
例如:如果我需要特定值的值为 10 个字符长度。即如果值为 3 个字符长度,我必须在其上附加 7 个空格。
当心。 DATALENGTH返回使用的字节数,而不是字符数。
len 计算使用的字符数而不是所需的存储空间,当您使用 nvarchar 而不是 varchar 时,这一点会更加明显
len 也不计算尾随空格
看看这个
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
len 的输出为 3,而 datalength = 10 的输出
只需使用替换():
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
这将用 LEN() 实际计数的字符替换尾随空格。
DataLength() 的问题是您必须跟踪您的字符串是 Unicode (nChar, nVarChar) 还是 ASCII (Char, VarChar) 才能知道是否还需要将 Unicode 字符串的数据长度除以 2。
我正要使用 Len(Replace('blah blah ',' ','_') 建议时,它让我印象深刻,它可能更有效地使用。只是发布以防有人像我一样偶然发现这个线程。
len('废话' + '.')-1
不幸的是,我知道没有完美的解决方案。
LEN(string + '.')-1
如果字符串是大小为 4000 或非 Unicode 且大小为 8000 的 Unicode,则建议的解决方案之一返回错误结果 (-1)。这是因为忽略了连接。如果需要,您可以通过将字符串转换为 MAX-size string: 来克服这个问题LEN(CAST(string as nvarchar(max)) + '.')-1
,但这值得吗?
正如其他人所提到的,DATALENGTH(string)
返回用于存储的字节数。对于 Unicode 字符串,将结果除以 2 可能还不够:Unicode 代理字符可以占用超过 16 位。
总而言之,请注意每种方法的局限性,并选择您认为会减少问题的任何方法。