sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server varbinær bigint med BitConverter.ToInt64 værdier er forskellige

Casting fra varbinary til bigint (og tilbage) bruger netværksbyterækkefølge (big-endian).BitConverter bruger endian-heden af ​​den maskine, den køres på (little-endian for x86 og x64).

Derfor BitConverter.GetBytes køre på -8588797048854775808 (0x88CE7696E7167800) er {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} og cast på {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} er 0x0088E91869893177 =38536887891734903.

Den oplagte ting at gøre er at gemme 64-bit heltal som 64-bit heltal i første omgang.

Hvis du virkelig har brug for at udføre denne konvertering, så:

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

Skifter rundt på bytes, mens den også er bærbar ved, at den ikke vil bytte om bytes, hvis den køres på en big-endian-maskine.

Alternativt, hvis du af en eller anden grund ikke ønsker at bruge System.Net-navnerummet, eller hvis du ønsker at kunne udvides til andre typer end de tre IPAddress.HostToNetworkOrder handles, brug:

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



  1. Lær hvordan du bruger flere funktioner i MySQL og MariaDB - Del 2

  2. Brug af PHP/MySQL til at beregne procenter

  3. PL/SQL udtræk SELECT-sætningskolonnenavne fra tilpasset forespørgsel

  4. MySql workbench CHECK begrænsning