sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server varbinary bigint med BitConverter.ToInt64-värden är olika

Castar från varbinary till bigint (och tillbaka) använder nätverksbyteordning (big-endian).BitConverter använder endian-heten för maskinen den körs på (little-endian för x86 och x64).

Därav BitConverter.GetBytes körs på -8588797048854775808 (0x88CE7696E7167800) är {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} och cast på {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} är 0x0088E91869893177 =38536887891734903.

Det självklara att göra är att bara lagra 64-bitars heltal som 64-bitars heltal i första hand.

Om du verkligen behöver göra den här konverteringen:

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

Kommer att byta runt byte, samtidigt som den är portabel genom att den inte kommer att byta byte om den körs på en big-endian-maskin.

Alternativt, om du inte vill använda System.Net-namnutrymmet av någon anledning, eller om du vill kunna utökas till andra typer än de tre IPAddress.HostToNetworkOrder handeles, använd:

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



  1. Php pdo foreach

  2. Program kraschar vid installation med fel sqlite3_exec - Det gick inte att ställa in synkront läge =1(Normal)

  3. 2 sätt att returnera rader som endast innehåller icke-alfanumeriska tecken i MySQL

  4. Förbättra prestanda för PostgresSQL-aggregeringsfrågor