Für diejenigen, die 2020 oder später immer noch zu dieser Frage kommen, gibt es neuere Optionen, die möglicherweise besser sind als beides von diesen. Beispiel:utf8mb4_0900_ai_ci
.
Alle diese Sortierungen gelten für die UTF-8-Zeichencodierung. Die Unterschiede bestehen darin, wie Text sortiert und verglichen wird.
_unicode_ci
und _general_ci
sind zwei unterschiedliche Sätze von Regeln zum Sortieren und Vergleichen von Text gemäß der Art und Weise, wie wir es erwarten. Neuere Versionen von MySQL führen auch neue Regelsätze ein, wie zum Beispiel _0900_ai_ci
für äquivalente Regeln basierend auf Unicode 9.0 - und ohne äquivalente _general_ci
Variante. Leute, die dies jetzt lesen, sollten wahrscheinlich eine dieser neueren Sortierungen anstelle von _unicode_ci
verwenden oder _general_ci
. Die nachstehende Beschreibung dieser älteren Zusammenstellungen dient nur zu Interessenszwecken.
MySQL wechselt derzeit von einer älteren, fehlerhaften UTF-8-Implementierung. Im Moment müssen Sie utf8mb4
verwenden statt utf8
für den Zeichencodierungsteil, um sicherzustellen, dass Sie die feste Version erhalten. Die fehlerhafte Version bleibt aus Gründen der Abwärtskompatibilität erhalten, obwohl sie veraltet ist.
Hauptunterschiede
-
utf8mb4_unicode_ci
basiert auf den offiziellen Unicode-Regeln für universelles Sortieren und Vergleichen, das in einer Vielzahl von Sprachen genau sortiert. -
utf8mb4_general_ci
ist ein vereinfachter Satz von Sortierregeln, der darauf abzielt, so gut wie möglich zu funktionieren, während er viele Abkürzungen nimmt, um die Geschwindigkeit zu verbessern. Es folgt nicht den Unicode-Regeln und führt in einigen Situationen zu unerwünschten Sortierungen oder Vergleichen, z. B. wenn bestimmte Sprachen oder Zeichen verwendet werden.Auf modernen Servern ist dieser Leistungsschub so gut wie vernachlässigbar. Es wurde zu einer Zeit entwickelt, als Server nur einen winzigen Bruchteil der CPU-Leistung heutiger Computer hatten.
Vorteile von utf8mb4_unicode_ci
über utf8mb4_general_ci
utf8mb4_unicode_ci
, das die Unicode-Regeln zum Sortieren und Vergleichen verwendet, verwendet einen ziemlich komplexen Algorithmus für die korrekte Sortierung in einer Vielzahl von Sprachen und bei der Verwendung einer Vielzahl von Sonderzeichen. Diese Regeln müssen sprachspezifische Konventionen berücksichtigen; nicht jeder sortiert seine Charaktere in einer sogenannten „alphabetischen Reihenfolge“.
Was lateinische (dh "europäische") Sprachen angeht, gibt es keinen großen Unterschied zwischen der Unicode-Sortierung und dem vereinfachten utf8mb4_general_ci
Sortierung in MySQL, aber es gibt noch ein paar Unterschiede:
-
Zum Beispiel sortiert die Unicode-Sortierung "ß" wie "ss" und "Œ" wie "OE", wie Benutzer dieser Zeichen normalerweise wollen, wohingegen
utf8mb4_general_ci
sortiert sie als einzelne Zeichen (vermutlich wie "s" bzw. "e"). -
Einige Unicode-Zeichen sind als ignorierbar definiert, was bedeutet, dass sie nicht zur Sortierreihenfolge zählen sollten und der Vergleich stattdessen zum nächsten Zeichen übergehen sollte.
utf8mb4_unicode_ci
handhabt diese richtig.
In nicht-lateinischen Sprachen, wie z. B. asiatischen Sprachen oder Sprachen mit unterschiedlichen Alphabeten, kann es viel mehr geben Unterschiede zwischen der Unicode-Sortierung und dem vereinfachten utf8mb4_general_ci
Sortierung. Die Eignung von utf8mb4_general_ci
hängt stark von der verwendeten Sprache ab. Für einige Sprachen wird es ziemlich unangemessen sein.
Was sollten Sie verwenden?
Es gibt mit ziemlicher Sicherheit keinen Grund, utf8mb4_general_ci
zu verwenden mehr, da wir den Punkt hinter uns gelassen haben, an dem die CPU-Geschwindigkeit niedrig genug ist, dass der Leistungsunterschied wichtig wäre. Ihre Datenbank wird mit ziemlicher Sicherheit durch andere Engpässe als diese eingeschränkt.
In der Vergangenheit haben einige Leute empfohlen, utf8mb4_general_ci
zu verwenden außer wenn eine genaue Sortierung wichtig genug war, um die Leistungskosten zu rechtfertigen. Heute sind diese Leistungskosten so gut wie verschwunden, und Entwickler nehmen die Internationalisierung ernster.
Es gibt ein Argument dafür, dass Sie, wenn Ihnen Geschwindigkeit wichtiger ist als Genauigkeit, auch überhaupt keine Sortierung vornehmen können. Es ist trivial, einen Algorithmus schneller zu machen, wenn er nicht unbedingt genau sein muss. Also utf8mb4_general_ci
ist ein Kompromiss, der wahrscheinlich aus Geschwindigkeitsgründen nicht benötigt wird und wahrscheinlich auch aus Genauigkeitsgründen nicht geeignet ist.
Eine andere Sache, die ich hinzufügen möchte, ist, dass selbst wenn Sie wissen, dass Ihre Anwendung nur die englische Sprache unterstützt, sie möglicherweise dennoch mit den Namen von Personen umgehen muss, die oft Zeichen enthalten können, die in anderen Sprachen verwendet werden, in denen es genauso wichtig ist, richtig zu sortieren . Die Verwendung der Unicode-Regeln für alles trägt dazu bei, dass die sehr schlauen Unicode-Leute sehr hart daran gearbeitet haben, dass das Sortieren richtig funktioniert.
Was die Teile bedeuten
Erstens, ci
ist für Groß-/Kleinschreibung sortieren und vergleichen. Dies bedeutet, dass es für Textdaten geeignet ist und die Groß-/Kleinschreibung keine Rolle spielt. Die anderen Sortierungstypen sind cs
(Groß-/Kleinschreibung beachten) für Textdaten, bei denen die Groß-/Kleinschreibung wichtig ist, und bin
, wenn die Codierung Bit für Bit übereinstimmen muss, was für Felder geeignet ist, die wirklich codierte Binärdaten sind (einschließlich beispielsweise Base64). Sortieren mit Berücksichtigung der Groß-/Kleinschreibung führt zu einigen seltsamen Ergebnissen, und Vergleiche mit Berücksichtigung der Groß-/Kleinschreibung können zu doppelten Werten führen, die sich nur in Groß- und Kleinschreibung unterscheiden, sodass Zusammenstellungen mit Berücksichtigung der Groß-/Kleinschreibung für Textdaten in Ungnade fallen - wenn die Groß-/Kleinschreibung für Sie von Bedeutung ist, dann ansonsten ignorierbare Interpunktion usw. ist wahrscheinlich auch von Bedeutung, und eine binäre Sortierung könnte angemessener sein.
Als nächstes unicode
oder general
bezieht sich auf die spezifischen Sortier- und Vergleichsregeln - insbesondere auf die Art und Weise, wie Text normalisiert oder verglichen wird. Es gibt viele verschiedene Regelwerke für die utf8mb4-Zeichenkodierung mit unicode
und general
Es sind zwei, die versuchen, in allen möglichen Sprachen gut zu funktionieren, anstatt in einer bestimmten. Die Unterschiede zwischen diesen beiden Regelwerken sind Gegenstand dieser Antwort. Beachten Sie, dass unicode
verwendet Regeln von Unicode 4.0. Neuere Versionen von MySQL fügen die Regelsätze unicode_520
hinzu Verwenden von Regeln aus Unicode 5.2 und 0900
(Löschen des "unicode_"-Teils) mit Regeln von Unicode 9.0.
Und schließlich utf8mb4
ist natürlich die intern verwendete Zeichenkodierung. In dieser Antwort spreche ich nur von Unicode-basierten Kodierungen.