【问题标题】:Len() vs datalength() in SQL Server 2005SQL Server 2005 中的 Len() 与 datalength()
【发布时间】:2019-04-29 12:54:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server datalength


    【解决方案1】:

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

    【讨论】:

    • NVARCHAR 字段上的 +1 LEN 返回字符串中的字符数,而 DATALENGTH() 返回该数字的两倍(因为 NVARCHAR 每个字符存储 2 个字节)
    • @marc_s 你一如既往的好:)
    【解决方案2】:

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

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

    这里是 MSDN 文档的链接:

    LEN()

    DATALENGTH()

    【讨论】:

    • LEN(N'testing one two three, nothing but a test') 返回 41 个字符,包括空格(以及返回 82 的 DATALENGTH())
    • @marc_s ...虽然它不计算尾随空格。 LEN('HELLO')、LEN('HELLO') 和 LEN('HELLO') 连续返回 5、5 和 10。这是记录在案的(“”)。
    • 这些示例没有前导/尾随空格,HELLO 之后有五个空格,HELLO 之前有五个空格。 HTML 折叠空格的乐趣 :-)
    • @marc_s,它并不总是计算空格,对吧?检查这个:sqlfiddle.com/#!18/56f78/236
    • @DT:是的,正如“Chris J”已经评论过的那样——LEN()尾随空格——但它是否计算字符串中嵌入的空格
    【解决方案3】:

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

    len 也不计算尾随空格

    看看这个

    declare @v nchar(5)
    select @v ='ABC  '
    
    
    select len(@v),datalength(@v)
    

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

    【讨论】:

      【解决方案4】:

      只需使用 Replace():

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          不幸的是,我知道没有完美的解决方案。

          如果字符串是大小为 4000 或非 Unicode 且大小为 8000 的 Unicode,LEN(string + '.')-1 会返回错误结果 (-1),这是一种建议的解决方案。这是因为忽略了连接。如果需要,您可以通过将字符串转换为最大大小的字符串来克服这个问题:LEN(CAST(string as nvarchar(max)) + '.')-1,但这值得吗?

          正如其他人所提到的,DATALENGTH(string) 返回用于存储的字节数。对于 Unicode 字符串,将结果除以 2 可能不够:Unicode surrogate characters 可以占用超过 16 位。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多