Len()vs SQL Server 2005中的datalength()

时间:2009-07-20 04:20:44

标签: sql-server datalength

最近我在查询中使用len()来查找查询的长度时遇到了一个问题,len()没有计算值中的尾随空格。但是datalength()也在计算尾随空格。

这是否意味着如果我正在做一些处理值的实际长度的操作,那么我必须使用dalalength()而不是len()

例如:如果我需要特定值的值为10个字符长度。即如果值为3个字符长度,我将为其附加7个空格。

6 个答案:

答案 0 :(得分:36)

小心点。 DATALENGTH返回使用的字节数,而不是字符数。

答案 1 :(得分:20)

是的,这正是你必须做的。如果您想获得排除空格的字符数,则可以使用LEN()函数,而在所有其他情况下DATALENGTH()

甚至LEN()文档都有一个信息,可以获取代表您应该使用的扩展名的字节数DATALENGTH()

以下是MSDN文档的链接:

LEN()

DATALENGTH()

答案 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位以上。

总而言之,请注意每种方法的局限性,并选择您认为会减少问题的方法。