Was ist der Unterschied zwischen den Zeichensätzen utf8mb4 und utf8 in MySQL?

341

Was ist der Unterschied zwischen utf8mb4und utf8Zeichensätzen in MySQL ?

Ich kenne bereits ASCII- , UTF-8- , UTF-16- und UTF-32- Codierungen. Ich bin jedoch gespannt, was der Unterschied zwischen utf8mb4Codierungsgruppen und anderen in MySQL Server definierten Codierungstypen ist .

Gibt es besondere Vorteile / Vorschläge für die Verwendung utf8mb4anstatt utf8?

Mojtaba Rezaeian
quelle

Antworten:

391

UTF-8 ist eine Codierung mit variabler Länge. Im Fall von UTF-8 bedeutet dies, dass zum Speichern eines Codepunkts ein bis vier Bytes erforderlich sind. Die MySQL-Codierung "utf8" (Alias ​​"utf8mb3") speichert jedoch nur maximal drei Bytes pro Codepunkt.

Der Zeichensatz "utf8" / "utf8mb3" kann also nicht alle Unicode-Codepunkte speichern: Er unterstützt nur den Bereich 0x000 bis 0xFFFF, der als " Basic Multilingual Plane " bezeichnet wird. Siehe auch Vergleich von Unicode-Codierungen .

Dies ist, was (eine frühere Version derselben Seite unter) die MySQL-Dokumentation dazu zu sagen hat:

Der Zeichensatz utf8 [/ utf8mb3] verwendet maximal drei Bytes pro Zeichen und enthält nur BMP-Zeichen. Ab MySQL 5.5.3 verwendet der Zeichensatz utf8mb4 maximal vier Bytes pro Zeichen und unterstützt zusätzliche Zeichen:

  • Für ein BMP-Zeichen haben utf8 [/ utf8mb3] und utf8mb4 identische Speichereigenschaften: gleiche Codewerte, gleiche Codierung, gleiche Länge.

  • Für ein zusätzliches Zeichen kann utf8 [/ utf8mb3] das Zeichen überhaupt nicht speichern , während utf8mb4 vier Bytes benötigt, um es zu speichern. Da utf8 [/ utf8mb3] das Zeichen überhaupt nicht speichern kann, haben Sie keine zusätzlichen Zeichen in den Spalten utf8 [/ utf8mb3] und müssen sich keine Gedanken über das Konvertieren von Zeichen oder den Verlust von Daten machen, wenn Sie utf8 [/ utf8mb3] -Daten von älteren Versionen von aktualisieren MySQL.

Wenn Sie also möchten, dass Ihre Spalte das Speichern von Zeichen unterstützt, die außerhalb des BMP liegen (und dies normalerweise möchten), z. B. Emoji , verwenden Sie "utf8mb4". Siehe auch Was sind die am häufigsten verwendeten Nicht-BMP-Unicode-Zeichen? .

CodeCaster
quelle
10
Die einzigen Fälle, auf die ich (bisher) gestoßen bin, in denen utf8mb4 "erforderlich" war, sind Chinesisch und Emoticons. Es gibt obskure Alphabete, die es brauchen.
Rick James
10
Dies ist auch erforderlich, wenn Sie verschlüsselte Kennwörter und Daten in Ihrer Datenbank speichern möchten. Ich habe das verschlüsselte Passwort in MySQL im normalen utf8-Format beibehalten, was mir große Probleme mit einigen Passwörtern verursachte, die zufällig und sehr schwer zu debuggen waren. Schließlich habe ich versucht, die Base64-Codierung zu verwenden, und das Problem vorübergehend behoben. Aber jetzt kenne ich den Grund.
Mojtaba Rezaeian
37
@idealidea verschlüsselte Daten sind binär, und Sie sollten keine binären Daten in einer varchar-Spalte speichern. :)
CodeCaster
8
@thomasrutter Versuchen Sie dieses (𡞰) Zeichen, um es mit UTF-8 zu speichern. :)
502_Geek
2
@MojtabaRezaeian es hängt etwas vom Passwort-Algorithmus ab - bcrypt2 erzeugt ASCII.
Jasen
60

Der utf8mb4Zeichensatz ist nützlich, da wir heutzutage Unterstützung benötigen, um nicht nur Sprachzeichen, sondern auch Symbole, neu eingeführte Emojis usw. zu speichern.

Eine schöne Lektüre über die Unterstützung von vollständigem Unicode in MySQL-Datenbanken von Mathias Bynens kann dies ebenfalls beleuchten.

Jimmy Kane
quelle
11
MySQL 8.0 ist jetzt standardmäßig der Zeichensatz utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk
47

Entnommen aus dem MySQL 8.0 Referenzhandbuch :

  • utf8mb4: Eine UTF-8- Codierung des Unicode- Zeichensatzes mit ein bis vier Bytes pro Zeichen.

  • utf8mb3: Eine UTF-8- Codierung des Unicode- Zeichensatzes mit ein bis drei Bytes pro Zeichen.

In MySQL utf8 ist derzeit ein Alias für utf8mb3welche ist veraltet und wird in einer zukünftigen entfernt werden MySQL - Release. An dieser Stelle utf8 wird ein Verweis auf utf8mb4 .

Unabhängig von diesem Alias ​​können Sie sich also bewusst eine utf8mb4Codierung festlegen .

Um die Antwort zu vervollständigen, möchte ich den Kommentar von @ WilliamEntriken unten hinzufügen (ebenfalls aus dem Handbuch entnommen):

Um Unklarheiten über die Bedeutung von zu vermeiden utf8, sollten Sie utf8mb4anstelle von Zeichensatzreferenzen explizit angeben utf8.

simhumileco
quelle