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

Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci?

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.