最近在使用len()
查询时,我遇到了一个问题:它没有计算值中的尾随空格,但是datalength()
也计算了尾随空格。
这是否意味着,如果我正在进行一些涉及实际值长度的操作,那么我必须使用datalength()
而不是len()
?
例如:如果我需要某个值的长度为10个字符长度。即如果该值的长度为3,则我必须在其后追加7个空格。
最近在使用len()
查询时,我遇到了一个问题:它没有计算值中的尾随空格,但是datalength()
也计算了尾随空格。
这是否意味着,如果我正在进行一些涉及实际值长度的操作,那么我必须使用datalength()
而不是len()
?
例如:如果我需要某个值的长度为10个字符长度。即如果该值的长度为3,则我必须在其后追加7个空格。
小心使用。 DATALENGTH 返回使用的字节数,而不是字符数。
是的,这正是你必须要做的。如果你只想获得不包括空格的字符数,你应该使用LEN()
函数,而在其他所有情况下应该使用DATALENGTH()
。
即使LEN()
的文档中也提到,如果要获取表示扩展名所需的字节数,应该使用DATALENGTH()
。
以下是MSDN文档的链接:
LEN()
不会计算尾随空格 - 但它会计算字符串中嵌入的空格。 - marc_sDATALENGTH()
比LEN()
更快,可能是因为在第一种情况下没有字符串处理。 - Kosmolen函数计算的是字符使用的数量,而不是所需的存储空间,在使用nvarchar代替varchar时,这一点会更加明显。
len函数也不计算尾随空格。
看一下下面的例子:
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
len的输出结果为3,而datalength的输出结果为10。
只需使用Replace()函数:
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
我本来想使用Len(Replace('blah blah ',' ','_')来实现目的,但突然想到可能有更高效的方法。我在这里发表一下,以防像我一样的人会偶然看到这篇文章。
len('blah blah ' + '.')-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位。