假设我们有以下将 int 数转换为二进制值 ie
cast(120 as binary(8))
或任何其他 int 数转换为binary(8)
.
我们通常期望的结果len(cast(120 as binary(8))) = 8
是正确的,除非我们尝试使用select len(cast(32 as binary(8)))
返回 7 的数字 32 !
这是 SQL Server 的错误吗?
假设我们有以下将 int 数转换为二进制值 ie
cast(120 as binary(8))
或任何其他 int 数转换为binary(8)
.
我们通常期望的结果len(cast(120 as binary(8))) = 8
是正确的,除非我们尝试使用select len(cast(32 as binary(8)))
返回 7 的数字 32 !
这是 SQL Server 的错误吗?
不是错误,这是LEN的工作原理。伦:
返回指定字符串表达式的字符数, 不包括尾随空格。
“尾随空格”的定义似乎因数据类型而异。对于二进制值,尾随空格是二进制表示“20”时。在 LEN 的 BOL 条目中,有一条注释如下:
使用 LEN 返回编码到给定字符串表达式中的字符数,使用 DATALENGTH 返回给定字符串表达式的大小(以字节为单位)。这些输出可能会有所不同,具体取决于 [value] 中使用的数据类型和编码类型。有关不同编码类型之间存储差异的更多信息,请参阅排序规则和 Unicode 支持。
对于以 20 结尾的二进制值,长度 ( LEN
) 减少 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 函数(这里)我创建了这个查询:
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
注意LEN
ofCAST(8224 AS binary(8)
是 6;因为 8224 以 2020 结尾,它被视为两个空格:
8224 0x0000000000002020 6 8