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?

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? .


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.