Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was sind die Unterschiede zwischen utf8_general_ci und utf8_unicode_ci?

utf8_general_ci ist eine sehr einfache – und unter Unicode sehr fehlerhafte – Sortierung, die falsche Ergebnisse liefert auf allgemeinen Unicode-Text. Was es tut, ist:

  • konvertiert in die Unicode-Normalisierungsform D für die kanonische Dekomposition
  • entfernt alle Kombinationszeichen
  • wandelt in Großbuchstaben um

Dies funktioniert unter Unicode nicht richtig, da es die Unicode-Schreibweise nicht versteht. Unicode-Schreibweise allein ist viel komplizierter, als es ein ASCII-orientierter Ansatz handhaben könnte. Zum Beispiel:

  • Der Kleinbuchstabe von „ẞ“ ist „ß“, aber der Großbuchstabe von „ß“ ist „SS“.
  • Es gibt zwei griechische Sigmas in Kleinbuchstaben, aber nur eins in Großbuchstaben; Betrachten Sie "Σίσυφος".
  • Buchstaben wie "ø" werden nicht in ein "o" plus ein diakritisches Zeichen zerlegt, was bedeutet, dass es nicht richtig sortiert wird.

Es gibt viele andere Feinheiten.

  1. utf8_unicode_ci verwendet den standardmäßigen Unicode Collation Algorithm , unterstützt sogenannte Erweiterungen und Ligaturen, zum Beispiel:Der deutsche Buchstabe ß (U+00DF BUCHSTABE S) wird neben „ss“ sortiert. Der Buchstabe Œ (U+0152 LATIN CAPITAL LIGATURE OE) wird neben „OE“ sortiert.

utf8_general_ci unterstützt keine Erweiterungen/Ligaturen, es sortiert alle diese Buchstaben als einzelne Zeichen und manchmal in einer falschen Reihenfolge.

  1. utf8_unicode_ci ist allgemein genauer für alle Skripte. Zum Beispiel auf kyrillischem Block:utf8_unicode_ci ist für alle diese Sprachen in Ordnung:Russisch, Bulgarisch, Weißrussisch, Mazedonisch, Serbisch und Ukrainisch. Während utf8_general_ci nur für die russische und bulgarische Teilmenge des Kyrillischen in Ordnung ist. Zusätzliche Buchstaben, die in Weißrussisch, Mazedonisch, Serbisch und Ukrainisch verwendet werden, werden nicht gut sortiert.

Die Kosten für utf8_unicode_ci ist, dass es ein wenig ist etwas langsamer als utf8_general_ci . Aber das ist der Preis, den man für die Korrektheit zahlt. Entweder Sie können eine schnelle Antwort haben, die falsch ist, oder eine etwas langsamere Antwort, die richtig ist. Ihre Wahl. Es ist sehr schwierig, falsche Antworten jemals zu rechtfertigen, daher ist es am besten anzunehmen, dass utf8_general_ci nicht existiert und immer utf8_unicode_ci zu verwenden . Nun, es sei denn, Sie wollen falsche Antworten.

Quelle:http://forums.mysql.com/read .php?103,187048,188748#msg-188748