最近我在查询中使用len()
来查找查询的长度时遇到了一个问题,len()
没有计算值中的尾随空格。但是datalength()
也在计算尾随空格。
这是否意味着如果我正在做一些处理值的实际长度的操作,那么我必须使用dalalength()
而不是len()
。
例如:如果我需要特定值的值为10个字符长度。即如果值为3个字符长度,我将为其附加7个空格。
答案 0 :(得分:36)
小心点。 DATALENGTH返回使用的字节数,而不是字符数。
答案 1 :(得分:20)
是的,这正是你必须做的。如果您想获得排除空格的字符数,则可以使用LEN()
函数,而在所有其他情况下DATALENGTH()
。
甚至LEN()
文档都有一个信息,可以获取代表您应该使用的扩展名的字节数DATALENGTH()
以下是MSDN文档的链接:
答案 2 :(得分:11)
len计算使用的字符数而不是所需的存储空间,当使用nvarchar而不是varchar时,这将更加明显
len不计算尾随空格
看看这个
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
,len的输出为3,而datalength的输出为10
答案 3 :(得分:2)
只需使用Replace():
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
这将用LEN()实际计数的字符替换尾随空格。
DataLength()的问题是您必须跟踪字符串是Unicode(nChar,nVarChar)还是ASCII(Char,VarChar),以了解是否还需要将Unicode字符串的数据长度除以2。
答案 4 :(得分:2)
我准备使用Len(替换('blah blah','','_') 建议当它让我感到震惊时,使用它可能更有效。只是发布以防万一有人偶然发现这个帖子。
len('blah blah'+'。') - 1
答案 5 :(得分:0)
不幸的是,我没有完美的解决方案。
如果字符串是大小为4000的Unicode或大小为8000的非Unicode,则建议的解决方案之一LEN(string + '.')-1
返回错误的结果(-1)。这是因为忽略了串联。您可以通过将字符串转换为最大大小的字符串LEN(CAST(string as nvarchar(max)) + '.')-1
来克服此问题,但这值得吗?
如其他人所述,DATALENGTH(string)
返回用于存储的字节数。对于Unicode字符串,将结果除以2可能还不够:Unicode surrogate characters可能占用16位以上。
总而言之,请注意每种方法的局限性,并选择您认为会减少问题的方法。