sql >> Database >  >> RDS >> Sqlserver

SQL Server GUID-sorteeralgoritme. Waarom?

Het algoritme is gedocumenteerd door de mensen van SQL Server hier:Hoe worden GUID's vergeleken in SQL Server 2005? Ik citeer hier hier (aangezien het een oud artikel is dat over een paar jaar voor altijd verdwenen kan zijn)

Over het algemeen zijn vergelijkingen van gelijkheid heel logisch met unieke identificatiewaarden. Als u echter merkt dat u algemene ordening nodig heeft, kijkt u mogelijk naar het verkeerde gegevenstype en moet u in plaats daarvan verschillende integer-typen overwegen.

Als u, na goed nadenken, besluit om op een uniqueidentifier-kolom te bestellen, zult u misschien verrast zijn door wat u terugkrijgt.

Gegeven deze twee uniqueidentifier-waarden:

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

Veel mensen denken dat @g1 kleiner is dan @g2, aangezien '55666BEE' zeker kleiner is dan '8DD5BCA5'. Dit is echter niet hoe SQL Server2005 uniqueidentifier-waarden vergelijkt.

De vergelijking wordt gemaakt door te kijken naar byte "groepen" van rechts naar links en van links naar rechts binnen een byte "groep". Een bytegroep is wat wordt begrensd door het teken '-'. Technisch gezien kijken we eerst naar bytes {10 tot 15}, dan {8-9}, dan {6-7}, dan {4-5} en als laatste {0 tot 3}.

In dit specifieke voorbeeld zouden we beginnen met het vergelijken van '86FF976E763F'met '393AE6BBB849'. We zien meteen dat @g2 inderdaad groter is dan @g1.

Merk op dat in .NET-talen Guid-waarden een andere standaardsorteervolgorde hebben dan in SQL Server. Als u de behoefte vindt om een ​​array of lijst van Guid te bestellen met behulp van SQL Server-vergelijkingssemantiek, kunt u in plaats daarvan anarray of lijst met SqlGuid gebruiken, die IComparable implementeert op een manier die consistent is met de SQL Server-semantiek.

Bovendien volgt de sortering de endianness van bytegroepen (zie hier:Globally unique identifier). De groepen 10-15 en 8-9 worden opgeslagen als big endian (overeenkomend met de Data4 in het wikipedia-artikel), dus worden ze vergeleken als big endian. Andere groepen worden vergeleken met behulp van little endian.



  1. Emuleren MySQL LIMIT-clausule in Microsoft SQL Server 2000

  2. Automatisering van MySQL-databaseimplementatie

  3. Onze meest populaire databaseblogposts in 2017

  4. HHVM gebruiken met WordPress