gpt4 book ai didi

sql-server - 将二进制转换为位

转载 作者:行者123 更新时间:2023-12-02 16:08:22 25 4
gpt4 key购买 nike

基于recent问题。

有人可以指出我对以下内容的解释吗?

如果我将 binary(4) 常量 0x80000000 转换为 int,则获取结果值并将其转换为 bit code> 类型,结果为 1。

select cast(0x80000000 as int) --> -2147483648
select cast(-2147483648 as bit) --> 1

但是如果我直接将 0x80000000 转换为位类型,结果为 0。

select cast(0x80000000 as bit) --> 0

我也希望在这种情况下得到 1,认为这个表达式可能相当于

select cast(cast(0x80000000 as binary(1)) as bit)

但事实并非如此。相反,似乎是取出二进制常量的最高字节并将其转换为位。所以,实际上它就像这样

select cast(cast(right(0x80000000, 1) as binary(1)) as bit)

我很清楚第一个binary -> int -> bit部分。我不清楚的是第二个 binary -> bit 部分。我无法找到 documentation 中解释的此行为,其中仅

Converting to bit promotes any nonzero value to 1.

已说明。

最佳答案

binary 不是数字,而是字节字符串。当您将 binary 转换为另一种类型时,会执行转换。当binary比目标数据类型长时,它会被从左侧截断。当它比目标短时,从左侧用零填充。异常(exception)情况是当转换为另一个字符串类型时(例如 varchar 或另一个 binary) - 它是从右侧填充和截断,这可能是一开始有点困惑:)

那么这里会发生什么?

select cast(cast(0x0F as binary(1)) as bit) -- 1 - 0x0F is nonzero
select cast(cast(0x01 as binary(1)) as bit) -- 1 - 0x01 is nonzero
select cast(cast(0x01 as binary(2)) as bit) -- 0 - truncated to 0x00, which is zero
select cast(cast(0x0100 as binary(2)) as bit) -- 0 - truncated to 0x00
select cast(cast(0x0001 as binary(2)) as bit) -- 1 - truncated to 0x01, nonzero

正如文档所述:

When data is converted from a string data type (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext, or image) to a binary or varbinary data type of unequal length, SQL Server pads or truncates the data on the right. When other data types are converted to binary or varbinary, the data is padded or truncated on the left. Padding is achieved by using hexadecimal zeros.

这是你可以使用的东西,因为:

select cast(0x0100 as binary(1)) -- 0x01

因此,如果您需要整个值非零,则基本上需要转换为整数数据类型(如果可能)。如果您想要最右边的字节,请使用cast as bit,如果您想要最左边的字节,请使用cast as binary(1)。任何其他都可以通过使用字符串操作函数来实现(binary 是一个字符串,而不是字符串)。 binary 不允许您执行诸如 0x01000 = 0 之类的操作 - 其中包括隐式转换为 int (在本例中),因此适用通常规则 - 0x0100000000 = 0 为 true。

另请注意,无法保证从 binary 进行的转换在 SQL Server 版本之间是一致的 - 它们并未得到真正的管理。

关于sql-server - 将二进制转换为位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com