Diese beiden Sortierreihenfolgen sind beide für die UTF-8 Zeichenkodierung. Die Unterschiede bestehen darin, wie Text sortiert und verglichen wird.
Hinweis: Seit MySQL 5.5.3 sollten Sie utf8mb4 anstelle von utf8 verwenden. Beide beziehen sich auf die UTF-8-Kodierung, aber das ältere utf8 hatte eine MySQL-spezifische Beschränkung, die die Verwendung von Zeichen oberhalb 0xFFFD verhinderte.
utf8mb4_unicode_ci
basiert auf dem Unicode-Standard für Sortierung und Vergleich, der eine genaue Sortierung in sehr vielen Sprachen ermöglicht.
utf8mb4_general_ci
kann nicht alle Unicode Sortierregeln implementieren, was in manchen Situationen zu unerwünschter Sortierung führt, z. B. bei der Verwendung bestimmter Sprachen oder Zeichen.
utf8mb4_general_ci
ist beim Vergleichen und Sortieren schneller, weil es eine Menge performance-bezogener Shortcuts benötigt.
Auf modernen Servern wird dieser Leistungsschub kaum spürbar sein. Es wurde in einer Zeit entwickelt, in der die Server einen winzigen Bruchteil der CPU-Leistung heutiger Computer hatten.
utf8mb4_unicode_ci
, das die Unicode-Regeln für Sortierung und Vergleich verwendet, verwendet einen ziemlich komplexen Algorithmus für die korrekte Sortierung in vielen Sprachen und bei der Verwendung einer Vielzahl von Sonderzeichen. Diese Regeln müssen sprachspezifische Konventionen berücksichtigen; nicht jeder sortiert seine Zeichen in einer so genannten alphabetischen Reihenfolge.
Was die lateinischen (d. h.“europäischen“) Sprachen betrifft, gibt es keinen großen Unterschied zwischen der Unicode-Sortierung und der vereinfachten utf8mb4_general_ci-Sortierung in MySQL, aber es gibt immer noch einige Unterschiede:
Beispielsweise sortiert die Unicode-Collation „ß“ wie „ss“und „Œ“ wie „OE“, wohingegen utf8mb4_general_ci
sie als einzelne Zeichen sortiert.
Einige Unicode-Zeichen sind als ignorierbar definiert, d. h. sie sollten nicht für die Sortierreihenfolge gezählt werden und der Vergleich sollte stattdessen auf das nächste Zeichen verschoben werden. utf8mb4_unicode_ci
behandelt diese richtig.
In nicht-lateinischen Sprachen, wie z. B. asiatischen Sprachen oder Sprachen mit unterschiedlichen Alphabeten, kann es noch viel mehr Unterschiede zwischen der Unicode-Sortierung und der vereinfachten Sortierung utf8mb4_general_ci
geben. Die Eignung von utf8mb4_general_ci
hängt stark von der verwendeten Sprache ab. Für manche Sprachen wird es völlig unzureichend sein.
Es gibt fast sicher keinen Grund mehr, utf8mb4_general_ci
zu verwenden, da wir den Punkt hinter uns gelassen haben, wo die CPU-Geschwindigkeit niedrig genug ist, dass der Performanceunterschied wichtig wäre. Die Datenbank wird mit Sicherheit durch andere Engpässe eingeschränkt.
Der Unterschied in der Leistung wird nur in ganz speziellen Situationen messbar sein. Wenn eine langsame Sortierung vorliegt, wird in fast allen Fällen ein Problem mit den Indizes/Abfrageplänen vorliegen. Die Änderung der Sortierfunktion sollte nicht ganz oben auf der Liste der Dinge stehen.
In der Vergangenheit empfahlen einige Leute, utf8mb4_general_ci
zu verwenden, außer wenn eine genaue Sortierung wichtig genug war, um die Leistungskosten zu rechtfertigen. Heute sind diese Leistungskosten praktisch verschwunden, und die Entwickler gehen mit der Internationalisierung ernsthafter um. Unter diesen Aspekten ist utf8mb4_unicode_ci
die bessere Wahl.
Übersetzt aus: https://stackoverflow.com/questions/766809
Vielen Dank für die super verständliche und ausführliche Erklärung!
Sehr schön erklärt! Hat mir in meiner Entscheidung sehr geholfen! 🙂
Danke.