Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

mengonversi versi baris server sql menjadi panjang atau ulong?

Itu penting. Anda ingin perbandingan Anda memiliki hasil yang sama dengan perbandingan SQL Server. SQL Server menggunakan perbandingan yang tidak ditandatangani pada jenis biner:

select case when 0x0FFFFFFFFFFFFFFF < 0xFFFFFFFFFFFFFFFF then 'unsigned' else 'signed' end

Jika Anda melakukan hal yang sama dengan long yang ditandatangani, 0xFFFFFFFFFFFFFFFF mewakili -1 . Itu berarti perbandingan Anda akan salah; itu tidak akan cocok dengan perbandingan yang sama yang dilakukan di SQL Server.

Yang pasti Anda inginkan adalah menggunakan ulong di mana 0xFFFFFFFFFFFFFFFF adalah ulong.MaxValue .

Endianness juga penting

Selain itu, seperti yang ditunjukkan Mark, BitConverter.GetUInt64 tidak mengkonversi dengan benar. Tandai tidak sepenuhnya benar - BitConverter adalah big-endian atau little-endian tergantung pada sistem yang dijalankannya. Anda dapat melihatnya sendiri . Juga, meskipun BitConverter selalu menjadi little-endian, Array.Reverse kurang berperforma dengan alokasi tumpukan dan penyalinan byte demi byte. BitConverter bukan alat yang tepat secara semantik atau praktis untuk pekerjaan itu.

Inilah yang Anda inginkan:

static ulong BigEndianToUInt64(byte[] bigEndianBinary)
{
    return ((ulong)bigEndianBinary[0] << 56) |
           ((ulong)bigEndianBinary[1] << 48) |
           ((ulong)bigEndianBinary[2] << 40) |
           ((ulong)bigEndianBinary[3] << 32) |
           ((ulong)bigEndianBinary[4] << 24) |
           ((ulong)bigEndianBinary[5] << 16) |
           ((ulong)bigEndianBinary[6] <<  8) |
                   bigEndianBinary[7];
}

Solusi terbersih

Perbarui :Jika Anda menggunakan .NET Core 2.1 atau yang lebih baru (atau .NET Standard 2.1), Anda dapat menggunakan BinaryPrimitives.ReadUInt64BigEndian yang sangat cocok.

Pada .NET Framework, berikut adalah solusi yang saya gunakan:Timestamp.cs . Pada dasarnya setelah Anda melakukan cast ke Timestamp , Anda tidak bisa salah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Teknik yang lebih baik untuk memangkas angka nol di depan di SQL Server?

  2. Masalah Menghubungkan ke server sql Login gagal. Login berasal dari domain yang tidak tepercaya dan tidak dapat digunakan dengan autentikasi Windows

  3. Bagaimana cara menghapus dari beberapa tabel menggunakan INNER JOIN di SQL server

  4. pilih penurunan kinerja pernyataan saat menggunakan DISTINCT dengan parameter

  5. Cara Menonaktifkan Semua Pemicu di Database SQL Server