sql >> Databáze >  >> RDS >> Sqlserver

SQL Server varbinary bigint s hodnotami BitConverter.ToInt64 se liší

Odesílání z varbinary na bigint (a zpět) používá síťové pořadí bajtů (big-endian).BitConverter používá endian-ness stroje, na kterém běží (little-endian pro x86 a x64).

Proto BitConverter.GetBytes spustit na -8588797048854775808 (0x88CE7696E7167800) je {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} a cast na {0x00,0x88,0xE9,0x18,0x69,0x89,0x31,0x77} je 0x0088E91869893177 =38536887891734903.

Zřejmá věc, kterou musíte udělat, je uložit 64bitová celá čísla jako 64bitová celá čísla.

Pokud opravdu potřebujete provést tento převod, pak:

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

Bude swapovat kolem bajtů a zároveň je přenosný v tom, že nezamění bajty, pokud bude spuštěn na stroji big-endian.

Případně, pokud z nějakého důvodu nechcete používat jmenný prostor System.Net nebo pokud chcete být rozšiřitelný na jiné typy než tři IPAddress.HostToNetworkOrder kliky, použijte:

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



  1. Instalace Percona XtraDB Cluster na CentOS 7

  2. Restartujte Mysql automaticky, když jej ubuntu na EC2 micro instanci zabije při nedostatku paměti

  3. Může %NOTFOUND po načtení vrátit hodnotu null?

  4. Jak automaticky odesílat e-maily, když uplynulý čas dosáhne konkrétních hodin?