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

Algoritma pengurutan SQL Server GUID. Mengapa?

Algoritme didokumentasikan oleh orang-orang SQL Server di sini:Bagaimana GUID dibandingkan di SQL Server 2005? Saya Kutip di sini (karena ini adalah artikel lama yang mungkin akan hilang selamanya dalam beberapa tahun)

Secara umum, perbandingan kesetaraan sangat masuk akal dengan nilai pengenal unik. Namun, jika Anda membutuhkan pengurutan umum, Anda mungkin melihat tipe data yang salah dan sebaiknya mempertimbangkan berbagai tipe integer sebagai gantinya.

Jika, setelah berpikir dengan hati-hati, Anda memutuskan untuk memesan pada kolom pengenal unik, Anda mungkin akan terkejut dengan apa yang Anda dapatkan kembali.

Mengingat dua nilai pengenal unik ini:

@g1='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'

Banyak orang berpikir bahwa @g1 kurang dari @g2, karena '55666BEE' tentu saja lebih kecil dari '8DD5BCA5'. Namun, ini bukanlah cara SQL Server2005 membandingkan nilai pengenal unik.

Perbandingan dilakukan dengan melihat byte "grup" kanan-ke-kiri, dan kiri-ke-kanan dalam "grup" byte. Grup byte adalah apa yang dibatasi oleh karakter '-'. Secara lebih teknis, kita melihat byte {10 hingga 15}pertama, lalu {8-9}, lalu {6-7}, lalu {4-5}, dan terakhir {0 hingga 3}.

Dalam contoh khusus ini, kita akan mulai dengan membandingkan '86FF976E763F' dengan '393AE6BBB849'. Langsung kita lihat bahwa @g2 memang lebih besar dari @g1.

Perhatikan bahwa dalam bahasa .NET, nilai Panduan memiliki pengurutan default yang berbeda dari pada SQL Server. Jika Anda merasa perlu memesan larik atau daftar Guid menggunakan semantik perbandingan SQL Server, Anda dapat menggunakan anarray atau daftar SqlGuid sebagai gantinya, yang mengimplementasikan IComparable in away yang konsisten dengan semantik SQL Server.

Plus, pengurutan mengikuti endianness grup byte (lihat di sini:Pengidentifikasi unik global). Grup 10-15 dan 8-9 disimpan sebagai big endian (sesuai dengan Data4 di artikel wikipedia), sehingga dibandingkan sebagai big endian. Grup lain dibandingkan menggunakan little endian.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penyembunyian Data Dinamis di SQL Server untuk Pengguna Tingkat Lanjut

  2. Fungsi vs Prosedur Tersimpan di SQL Server

  3. Akses ke kumpulan Hasil dari dalam Prosedur tersimpan Transact-SQL SQL Server

  4. Bagaimana Memperbaiki "Pernyataan EXECUTE gagal karena dengan klausa WITH RESULT SETS ditentukan 2 kolom untuk kumpulan hasil ..." Msg 11537 di SQL Server

  5. Gunakan float atau desimal untuk jumlah dolar aplikasi akuntansi?