【问题标题】:does LEN() have bug?LEN() 有错误吗?
【发布时间】:2021-12-23 21:22:01
【问题描述】:

LEN() 似乎忽略了变量右侧的空格。

declare @a varchar(100)

set @a = 'John   '

print len(@a)

上面的代码打印 4 而应该是 7。

这是一个错误吗?

【问题讨论】:

标签: sql-server


【解决方案1】:

这不是错误,这是预期的行为。引用the documentation

LEN 不包括尾随空格。如果这是一个问题,请考虑使用不会修剪字符串的DATALENGTH (Transact-SQL) 函数

【讨论】:

  • 感谢您的回答。但是,我不认为 DATALENGTH 是一个正确的答案。 DATALENGTH() 返回字符串在内存中消耗的字节数。对于 VARCHAR() 类型,它可以正常工作,但对于 NVARCHAR() 类型,它返回的字符数是给定字符串中字符数的两倍。因此,DATALENGTH 不会总是报告正确的答案。
【解决方案2】:

不是bug,是right there in the documentation:

返回指定字符串表达式的字符数,不包括尾随空格。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      谢谢大家,

      我真的不知道 LEN() 会忽略尾随空格!

      我认为 DATALENGTH() 并不总是返回正确的答案。

      对于 NVARCHAR() 类型,它返回字符串中字符数的两倍。实际上,它返回的是字符串在内存中消耗的字节总数。

      在我看来,为了得到一个字符串值的正确长度,我们应该使用如下公式:

      CREATE FUNCTION dbo.Length(@x NVARCHAR(MAX)) RETURNS INT
      AS
      BEGIN
          RETURN (CASE WHEN RIGHT(@x, 1) = ' ' THEN LEN(REPLACE(@x, ' ', '$')) ELSE LEN(@x) END)
      END
      

      该功能效率不高。我知道。但是,它至少会返回一个正确的答案。

      【讨论】:

        猜你喜欢
        • 2017-09-28
        • 2019-04-24
        • 2012-08-02
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 2018-10-01
        相关资源
        最近更新 更多