SQL Server 2005中的Len()与datalength()有何区别?

35

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

这是否意味着,如果我正在进行一些涉及实际值长度的操作,那么我必须使用datalength()而不是len()

例如:如果我需要某个值的长度为10个字符长度。即如果该值的长度为3,则我必须在其后追加7个空格。

6个回答

37

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


9
+1 对 NVARCHAR 字段执行 LEN 函数会返回字符串中字符的数量,而 DATALENGTH() 函数返回的是该数字的两倍(因为 NVARCHAR 每个字符占用 2 个字节)。 - marc_s
1
@marc_s 你总是一针见血,非常准确 :) - anar khalilov

23

是的,这正是你必须要做的。如果你只想获得不包括空格的字符数,你应该使用LEN()函数,而在其他所有情况下应该使用DATALENGTH()

即使LEN()的文档中也提到,如果要获取表示扩展名所需的字节数,应该使用DATALENGTH()

以下是MSDN文档的链接:

LEN()

DATALENGTH()


LEN(N'testing one two three, nothing but a test') 返回41个字符(包括空格)(对其使用 DATALENGTH() 返回82) - marc_s
7
@marc_s... 但它不计算尾随空格。LEN('HELLO')、LEN('HELLO ') 和 LEN(' HELLO') 分别返回 5、5 和 10。这已经有文件记录了("")。 - Chris J
1
这些示例旨在没有前导/尾随空格,在HELLO之后有五个空格,在HELLO之前有五个空格。 HTML折叠空格的乐趣 :-) - Chris J
@marc_s,它并不总是计算空格,对吧?看看这个:http://www.sqlfiddle.com/#!18/56f78/236 - DxTx
1
@DT:是的,正如“Chris J”已经评论的那样 - LEN()不会计算尾随空格 - 但它会计算字符串中嵌入的空格。 - marc_s
另一个区别似乎是DATALENGTH()LEN()更快,可能是因为在第一种情况下没有字符串处理。 - Kosmo

12

len函数计算的是字符使用的数量,而不是所需的存储空间,在使用nvarchar代替varchar时,这一点会更加明显。

len函数也不计算尾随空格。

看一下下面的例子:

declare @v nchar(5)
select @v ='ABC  '


select len(@v),datalength(@v)

len的输出结果为3,而datalength的输出结果为10。


3

只需使用Replace()函数:

SELECT LEN(REPLACE(N'4 Trailing Spaces:    ', ' ', '_'))

这将把末尾空格替换为LEN()实际计数的字符。

DataLength()的问题在于,您必须跟踪字符串是Unicode(nChar,nVarChar)还是ASCII(Char,VarChar),以知道是否还需要将Unicode字符串的数据长度除以2。

2

我本来想使用Len(Replace('blah blah ',' ','_')来实现目的,但突然想到可能有更高效的方法。我在这里发表一下,以防像我一样的人会偶然看到这篇文章。

len('blah blah ' + '.')-1


1
很不幸,我不知道有任何完美的解决方案。
其中一个提出的解决方案 LEN(string + '.')-1 如果字符串是大小为4000的Unicode或大小为8000的非Unicode,则会返回错误结果(-1),因为连接被忽略了。如果您想要克服这个问题,可以将字符串转换为MAX-size字符串:LEN(CAST(string as nvarchar(max)) + '.')-1,但这值得吗?
正如其他人所提到的,DATALENGTH(string) 返回用于存储的字节数。对于Unicode字符串,仅将结果除以2可能不足:Unicode surrogate characters 可以使用超过16位。
总之,请注意每种方法的限制,并选择您认为会给您带来更少问题的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接