gpt4 book ai didi

sql-server - SQL Server varbinary bigint 与 BitConverter.ToInt64 值不同

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

我将 SQL Server 表中的 long 值保存为 varbinary(max):

var savedValue = BitConverter.GetBytes(longValue);

现在我需要在 T-SQL 查询中使用该值,但是当我尝试获取值时:

select cast(Value as bigint) from dbo.MyValues

它返回不同的数值。例如,如果我在 .NET 中保存 -8588797048854775808,在 T-SQL 中我会得到 33802181122903688

请告诉我出了什么问题?这个问题有解决办法吗?

最佳答案

varbinarybigint(以及返回)的转换使用网络字节顺序(big-endian)。BitConverter 使用运行它的机器的字节序(x86 和 x64 为小字节序)。

因此,在 -8588797048854775808 (0x88CE7696E7167800) 上运行的 BitConverter.GetBytes 为 {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77},并且 cast 为{0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} 是 0x0088E91869893177 = 38536887891734903。

显而易见的做法是首先将 64 位整数存储为 64 位整数。

如果您确实需要进行此转换,那么:

var savedValue = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(longValue))

将交换字节,同时也是可移植的,因为如果在大端机器上运行,它不会交换字节。

或者,如果您出于某种原因不想使用 System.Net 命名空间,或者如果您希望可扩展到三个 IPAddress.HostToNetworkOrder 句柄以外的类型,请使用:

var savedValue = BitConverter.GetBytes(longValue);
if(BitConverter.IsLittleEndian)
Array.Reverse(savedValue);

关于sql-server - SQL Server varbinary bigint 与 BitConverter.ToInt64 值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467072/

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