34

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

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

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

4

6 回答 6

36

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

于 2009-07-20T04:28:33.060 回答
22

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

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

以下是 MSDN 文档的链接:

镜头()

数据长度()

于 2009-07-20T04:26:34.530 回答
11

len 计算使用的字符数而不是所需的存储空间,当您使用 nvarchar 而不是 varchar 时,这一点会更加明显

len 也不计算尾随空格

看看这个

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


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

len 的输出为 3,而 datalength = 10 的输出

于 2009-07-20T14:20:51.563 回答
2

只需使用替换():

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

这将用 LEN() 实际计数的字符替换尾随空格。

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

于 2013-03-18T21:34:53.527 回答
2

我正要使用 Len(Replace('blah blah ',' ','_') 建议时,它让我印象深刻,它可能更有效地使用。只是发布以防有人像我一样偶然发现这个线程。

len('废话' + '.')-1

于 2017-07-26T04:18:08.643 回答
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 位。

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

于 2018-10-11T06:26:35.940 回答