Frage Was sind die Unterschiede zwischen utf8_general_ci und utf8_unicode_ci? [Duplikat]


Mögliche Duplikate:
Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci? 

Ich habe zwei Optionen für Unicode, die vielversprechend für eine MySQL-Datenbank aussehen.

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive

Kannst du bitte erklären, was der Unterschied zwischen utf8_general_ci und utf8_unicode_ci ist? Welche Auswirkungen hat die Auswahl einer Datenbank beim Entwurf einer Datenbank?


76
2018-06-24 04:49


Ursprung


Antworten:


utf8_general_ci ist eine sehr einfache - und auf Unicode, sehr kaputte - Kollatierung, eine, die gibt falsche Ergebnisse auf allgemeinen Unicode-Text. Was es macht ist:

  • konvertiert in die Unicode-Normalisierungsform D für die kanonische Dekomposition
  • Entfernt alle kombinierenden Zeichen
  • konvertiert in Großbuchstaben

Dies funktioniert nicht korrekt in Unicode, weil Unicode-Gehäuse nicht verstanden wird. Unicode-Gehäuse allein ist viel komplizierter, als ein ASCII-orientierter Ansatz bewältigen kann. Beispielsweise:

  • Der Kleinbuchstabe von "ẞ" ist "ß", aber der Großbuchstabe von "ß" ist "SS".
  • Es gibt zwei griechische Kleinbuchstaben, aber nur einen Großbuchstaben; betrachte "Σίσυφος".
  • Buchstaben wie "ø" zerfallen nicht zu einem "o" und einem diakritischen Zeichen, was bedeutet, dass sie nicht korrekt sortiert werden.

Es gibt viele andere Feinheiten.

  1. utf8_unicode_ci verwendet den Standard Unicode-Sortierfolgenalgorithmus, unterstützt so genannte Erweiterungen und Ligaturen, zum Beispiel: Deutscher Buchstabe ß (U + 00DF LETTER SHARP S) ist in der Nähe von "ss" sortiert Buchstabe Œ (U + 0152 LATIN CAPITAL LIGATURE OE) ist in der Nähe von "OE" sortiert.

utf8_general_ci unterstützt keine Erweiterungen / Ligaturen, sortiert es 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 im kyrillischen Block: utf8_unicode_ci ist gut für alle diese Sprachen: Russisch, Bulgarisch, Weißrussisch, Mazedonisch, Serbisch und Ukrainisch. Während utf8_general_ci ist nur für russische und bulgarische Untergruppe von kyrillisch. Zusätzliche Buchstaben in belarussischen, mazedonischen, serbischen und ukrainischen verwendet sind nicht gut sortiert.

Die Kosten von utf8_unicode_ci ist, dass es ein ist wenig Bit langsamer als utf8_general_ci. Aber das ist der Preis, den Sie für die Richtigkeit zahlen. Entweder kannst du eine schnelle Antwort haben, die falsch ist, oder eine etwas langsamere Antwort, die richtig ist. Deine Entscheidung.  Es ist sehr schwierig, jemals falsche Antworten zu rechtfertigen, also ist es das Beste, das anzunehmen utf8_general_ci existiert nicht und immer zu benutzen utf8_unicode_ci. Nun, es sei denn, Sie wollen falsche Antworten.

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


122
2018-06-24 04:55



Von Unicode-Zeichensätze in dem MySQL-Dokumentation:

Für jeden Unicode-Zeichensatz werden mit dem Befehl _general_ci Kollationierung ist schneller als die für die _unicode_ci Kollation. Zum Beispiel, Vergleiche für die utf8_general_ci Vergleiche sind schneller, aber etwas weniger korrekt als Vergleiche für utf8_unicode_ci. Der Grund dafür ist, dass utf8_unicode_ci unterstützt Mappings wie Expansionen; Das heißt, wenn ein Zeichen den Kombinationen anderer Zeichen gleichwertig ist. Zum Beispiel in Deutsch und einigen anderen Sprachen "ß" entspricht "ss". utf8_unicode_ci unterstützt auch Kontraktionen und ignorierbare Charaktere. utf8_general_ci ist eine ältere Sortierung, die keine Erweiterungen, Kontraktionen oder ignorierbare Zeichen unterstützt. Es kann nur Eins-zu-Eins-Vergleiche zwischen Zeichen vornehmen.


19