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

var savedValue = BitConverter.GetBytes(longValue);

现在,我需要在T-SQL查询中使用该值,但是当我尝试获取值时:
select cast(Value as bigint) from dbo.MyValues

它返回不同的数字值。例如,如果我在.NET中保存了-8588797048854775808,则在T-SQL中,我得到了33802181122903688
请告诉我是什么问题?这个问题有解决办法吗?

最佳答案

varbinary转换为bigint(并反向转换)使用网络字节顺序(大端)。BitConverter使用运行它的计算机的字节序(对于x86和x64,为小字节序)。

因此,在-8588797048854775808(0x88CE7696E7167800)上运行的BitConverter.GetBytes是{0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77},而在{0x00,0x88,0xE9,0x18,0x69,0x89,6983上的cast = 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 - 具有BitConverter.ToInt64值的SQL Server varbinary bigint不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8467072/

10-12 01:15
查看更多