Unterschied zwischen der Zeichencodierung utf8_general_ci und utf8_unicode_ci

on

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.

Genauigkeit

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.

Leistung

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.

Welche Zeichencodierung sollte verwendet werden?

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

3 thoughts on “Unterschied zwischen der Zeichencodierung utf8_general_ci und utf8_unicode_ci

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert