【问题标题】:SQL Server LEN function reports wrong resultSQL Server LEN 函数报告错误结果
【发布时间】:2019-12-09 18:14:45
【问题描述】:

假设我们将以下整数转换为二进制值,即 cast(120 as binary(8)) 或任何其他 int 数转换为 binary(8)

我们通常对 len(cast(120 as binary(8))) = 8 的期望是这样,除非我们尝试使用数字 32,而 select len(cast(32 as binary(8))) 返回 7!

这是 SQL Server 的错误吗?

【问题讨论】:

    标签: tsql sql-server-2016 sql-server-2019


    【解决方案1】:

    不是错误,LEN 就是这样工作的。伦:

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

    “尾随空格”的定义似乎因数据类型而异。对于二进制值,尾随空格是当二进制表示为“20”时。在 LEN 的 BOL 条目中,有一条注释显示,

    使用 LEN 返回编码到给定的字符数 字符串表达式和 DATALENGTH 以返回以字节为单位的大小 给定的字符串表达式。 这些输出可能会有所不同,具体取决于 [值]中使用的数据类型和编码类型。更多 有关不同编码类型之间存储差异的信息, 请参阅排序规则和 Unicode 支持。

    对于二进制,长度 (LEN) 对于以 20 结尾的二进制值减少 1,对于以 2020 结尾的值减少 2,等等。同样,它将该值视为尾随空格。 DATALENGTH 解决了这个问题。注意这条 SQL:

    DECLARE 
      @string VARCHAR(100) = '1234567 ',
      @binary BINARY(8)    = 32;
    
    SELECT [Type] = 'string',   [Len] = LEN(@string), [Datalength] = DATALENGTH(@string)
    UNION ALL
    SELECT [Type] = 'binary(8)', [Len] = LEN(@binary), [Datalength] = DATALENGTH(@binary);
    

    返回:

    Type      Len         Datalength
    --------- ----------- -----------
    string    7           8
    binary(8) 7           8
    

    使用我的 rangeAB 函数 (here) 我创建了这个查询:

    SELECT 
      N            = r.RN,
      Binaryvalue  = CAST(r.RN AS binary(8)), 
      [Len]        = LEN(CAST(r.RN AS binary(8))),
      [DataLength] = DATALENGTH(CAST(r.RN AS binary(8)))
    FROM     dbo.rangeAB(0,10000,1,0) AS r
    WHERE    LEN(CAST(r.RN AS binary(8))) <> 8
    ORDER BY N;
    

    注意这些结果:

    N                    Binaryvalue        Len         DataLength
    -------------------- ------------------ ----------- -----------
    32                   0x0000000000000020 7           8
    288                  0x0000000000000120 7           8
    544                  0x0000000000000220 7           8
    800                  0x0000000000000320 7           8
    1056                 0x0000000000000420 7           8
    1312                 0x0000000000000520 7           8
    1568                 0x0000000000000620 7           8
    1824                 0x0000000000000720 7           8
    2080                 0x0000000000000820 7           8
    2336                 0x0000000000000920 7           8
    2592                 0x0000000000000A20 7           8
    2848                 0x0000000000000B20 7           8
    3104                 0x0000000000000C20 7           8
    3360                 0x0000000000000D20 7           8
    3616                 0x0000000000000E20 7           8
    3872                 0x0000000000000F20 7           8
    4128                 0x0000000000001020 7           8
    4384                 0x0000000000001120 7           8
    4640                 0x0000000000001220 7           8
    4896                 0x0000000000001320 7           8
    5152                 0x0000000000001420 7           8
    5408                 0x0000000000001520 7           8
    5664                 0x0000000000001620 7           8
    5920                 0x0000000000001720 7           8
    6176                 0x0000000000001820 7           8
    6432                 0x0000000000001920 7           8
    6688                 0x0000000000001A20 7           8
    6944                 0x0000000000001B20 7           8
    7200                 0x0000000000001C20 7           8
    7456                 0x0000000000001D20 7           8
    7712                 0x0000000000001E20 7           8
    7968                 0x0000000000001F20 7           8
    8224                 0x0000000000002020 6           8
    8480                 0x0000000000002120 7           8
    8736                 0x0000000000002220 7           8
    8992                 0x0000000000002320 7           8
    9248                 0x0000000000002420 7           8
    9504                 0x0000000000002520 7           8
    9760                 0x0000000000002620 7           8
    

    注意CAST(8224 AS binary(8)LEN 是6;因为 8224 以 2020 结尾,被视为两个空格:

    8224                 0x0000000000002020 6           8
    

    【讨论】:

    • 非常感谢艾伦的回答。虽然我知道 dataLength 函数,但我不认为(也不知道)二进制数据的 Len 函数的性质。我已经在我的代码中用 DataLenght 替换了它。
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2014-06-28
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多