So unterstützen Sie vollständiges Unicode in MySQL/MariaDB

So unterstützen Sie vollständiges Unicode in MySQL/MariaDB

Verwenden Sie in MySQL niemals utf8 und immer utf8mb4.

Einführung in utf8mb4

In MySQL/MariaDB ist der UTF-8-Zeichensatz keine echte Implementierung von Unicode, d. h. es handelt sich nicht um eine echte UTF-8-Kodierung, da er Zeichen mit bis zu 3 Bytes unterstützt.
Als Zeichenkodierung mit variabler Länge unterstützt UTF-8 bis zu 4 Byte. Für einige Zeichen wie Emoji sowie traditionelle chinesische, japanische und koreanische Schriftzeichen sind 4 Byte erforderlich, um sie vollständig zu speichern. Mit anderen Worten: Wenn Sie alle Unicode-Kodierungen unterstützen möchten, reicht UTF-8 in MySQL/MariaDB nicht aus.

Die UTF-8-Kodierung kann jedes Symbol im Unicode-Zeichensatz darstellen, von U+000000 bis U+10FFFF. Das sind 1.114.112 mögliche Symbole. (Nicht allen dieser Unicode-Codepunkte sind Zeichen zugewiesen, aber das hindert UTF-8 nicht daran, sie zu kodieren. Unicode ordnet Zeichen tatsächlich insgesamt 1.112.064 Codepunkten zu.) UTF-8 ist eine Kodierung mit variabler Breite; zur Kodierung jedes Symbols werden ein bis vier (8-Bit-)Bytes verwendet. Dies spart Platz zum Speichern von Low-Code-Werten.

Und es kann alle Charaktere vollständig darstellen.

UTF-8 ist wohl die beliebteste Kodierungsimplementierung von Unicode.

Die echte UTF-8-Kodierung, die in MySQL/MariaDB implementiert ist, ist utf8mb4, die bis zu 4 Byte Speicher unterstützt.

Es gibt insgesamt 1.048.576 mögliche Codepunkte, die nicht verwendet werden können. MySQLs UTF-8 erlaubt nur die Speicherung von 5,88 % aller möglichen Unicode-Codepunkte ((0x00FFFF + 1) / (0x10FFFF + 1)). Korrektes UTF-8 kann 100 % aller Unicode-Codepunkte kodieren.

Fehler bei überschrittener Byteanzahl bei UTF8

Wenn UTF-8 verwendet wird und 4-Byte-Zeichen wie Emoji gespeichert werden, wird normalerweise der Fehler Error: 1366 gemeldet:

[Err] 1366 - Falscher String-Wert: '\xF0\x9F\x98\x93' für Spalte 'xxx' in Zeile xx

[Fehler] 1366 - Falscher Zeichenfolgenwert: „\x...“ für Spalte „xxx“ in Zeile xx

utf8mb4-Unterstützung

Das utf8mb4 in MySQL/MariaDB ist eine Ergänzung zum ursprünglichen utf8, das nur Zeichen mit einer Größe von 3 Byte speichern kann. Es ist eine echte UTF-8-Kodierung.

Unterstützt seit MySQL 5.5.3+.

Ab MySQL 8.0 wurde der Standardzeichensatz auf utf8mb4 geändert. Das heißt, wenn Sie MySQL 8.0 und höher verwenden, müssen Sie sich über das Problem der Bytelänge keine Gedanken machen.
Der Standardzeichensatz für MariaDB 10.x ist weiterhin latin1. Daher sollte es normalerweise in utf8mb4 geändert werden.

Die allgemein verwendeten Sortierregeln entsprechend utf8mb4 sind: utf8mb4_general_ci und utf8mb4_unicode_ci.

Stellen Sie die Standardzeichenkodierung auf utf8mb4 und die entsprechenden Sortierregeln ein.

Den aktuellen Code ansehen

Verwenden Sie nach der Anmeldung bei MySQL/MariaDB SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';, um den Zeichensatz und die Sortierung anzuzeigen.

Zeigen Sie den Zeichensatz an:

MariaDB [(keine)]> Variablen wie „Charakter%“ anzeigen;
+-----------------------------------------+------------------------------------------------+
| Variablenname | Wert |
+-----------------------------------------+------------------------------------------------+
| Zeichensatzclient | gbk |
| Zeichensatzverbindung | gbk |
| Zeichensatzdatenbank | utf8 |
| Zeichensatz_Dateisystem | Binär |
| Zeichensatzergebnisse | gbk |
| Zeichensatzserver | utf8 |
| Zeichensatzsystem | utf8 |
| character_sets_dir | C:\Programme\MariaDB 10.3n\share\charsets\ |
+-----------------------------------------+------------------------------------------------+
8 Zeilen im Satz (0,043 Sek.)

Da es unter chinesischem Windows installiert wird, enthält es gbk.

Ändern Sie die MySQL/Mariadb-Konfigurationsdatei und ändern Sie die UTF8-Kodierung in utf8mb4

  • Ändern Sie unter Linux die Datei /etc/my.cnf oder /etc/my.cnf.d/server.cnf und fügen Sie unter [mysql], [mysqld] usw. den folgenden Inhalt hinzu:
  • Ändern Sie unter Windows die Datei data/my.ini im MySQL/Mariadb-Installationsverzeichnis und fügen Sie Inhalt unter [mysql], [mysqld] usw. hinzu.

my.cnf unter Linux:

> vim /etc/meine.cnf
#
# Diese Gruppe wird sowohl vom Client als auch vom Server gelesen
# verwenden Sie es für Optionen, die alles betreffen
#
[Client-Server]

[mysqld]
Zeichensatzserver = utf8mb4
init_connect = "Namen festlegen utf8mb4"
Sortierserver = utf8mb4_unicode_ci
Zeichensatz-Client-Handshake = FALSCH

[Kunde]
Standardzeichensatz = utf8mb4

[mysql]
Standardzeichensatz = utf8mb4
#
# alle Dateien aus dem Konfigurationsverzeichnis einbinden
#
!includedir /etc/my.cnf.d

my.ini unter Windows:

[mysqld]
datadir=C:/Programme/MariaDB 10.3n/data
Port = 3306
Zeichensatzserver = utf8mb4
# Die Verwendung des eindeutigen Optionspräfixes „character_set_client“ ist fehleranfällig und kann in Zukunft zu Fehlern führen. Verwenden Sie stattdessen den vollständigen Namen „character-set-client-handshake“.
Zeichensatz-Client-Handshake = utf8mb4  
# Zeichensatzclient = utf8mb4
Sortierserver = utf8mb4_unicode_ci
init_connect = "Namen festlegen utf8mb4"
Zeichensatz-Client-Handshake überspringen = falsch
Zeichensatzdateisystem = binär
Kleinbuchstabentabellennamen = 2 

[mysqldump]
loose_character_set_client=utf8mb4

[mysql]
Standardzeichensatz = utf8mb4

[Kunde]
Port = 3306
plugin-dir=C:/Programme/MariaDB 10.3n/lib/plugin
Standardzeichensatz = utf8mb4

Es werden verschiedene Einstellungspunkte beschrieben:

  • character-set-client-handshake=FALSE kann das Ergebnis der Collation_connection zu utf8mb4_unicode_ci statt utf8mb4_general_ci beeinflussen. Natürlich funktioniert auch die Verwendung von SET collation_connection = utf8mb4_unicode_ci oder collation_connection = utf8mb4_unicode_ci.
  • SET NAMES gibt den von der Clientverbindung verwendeten Zeichensatz an, d. h. den Zeichensatz, der zum Senden von SQL-Anweisungen an den Server verwendet wird. Zeichensatzserver: Legt den Server-Zeichensatz fest. Um utf8mb4 richtig zu verwenden, müssen Sie sicherstellen, dass Ihr Client, Server und Ihre Verbindung alle auf utf8mb4 eingestellt sind.
  • Alle anderen Standardeinstellungen in Bezug auf Zeichensätze, wie etwa init_connect, werden vom Zeichensatzserver übernommen, was bedeutet, dass es nicht notwendig ist, init-connect, character_set_client, character_set_results, character_set_connection usw. separat anzugeben. Daher kann init_connect in den obigen Einstellungen weggelassen werden.
  • Der Kodierungswert für die Verbindung ermöglicht MySQL, Eingaben korrekt zu dekodieren und Ergebnisse zu kodieren. Andernfalls wird es intern neu kodiert.

Die reinen und präzisen Einstellungen für den utf8mb4-Zeichensatz und die Sortierregeln lauten wie folgt und es sind nur 5 Einstellungen erforderlich:

[Kunde]
Standardzeichensatz = utf8mb4

[mysql]
Standardzeichensatz = utf8mb4

[mysqld]
Zeichensatz-Client-Handshake = FALSE
Zeichensatzserver = utf8mb4
Sortierserver = utf8mb4_unicode_ci

Starten Sie MySQL/MariaDB neu

Verwenden Sie unter Linux „systemctl restart mariadb“ oder „systemctl restart mysqld“. Neustart (nicht Neuladen) muss verwendet werden.

Der von früheren Versionen von MariaDB gestartete oder neu gestartete Dienst heißt mysqld (mysqld.service). systemctl startet mysqld neu

Öffnen Sie in Windows „Dienste“, suchen Sie in den Diensten den entsprechenden Dienst von MariaDB oder MySQL, klicken Sie mit der rechten Maustaste darauf und starten Sie ihn neu.

Überprüfen Sie den Zeichensatz und die Sortierung erneut

Nachdem die obigen Änderungen nach dem Neustart wirksam werden, überprüfen Sie erneut, wie unten gezeigt, ist es utf8mb4 und utf8mb4_unicode_ci geworden.

MariaDB [(keine)]> VARIABLEN ANZEIGEN, WO Variablenname WIE 'Zeichensatz%' ODER Variablenname WIE 'Sortier%';
+--------------------------+--------------------+
| Variablenname | Wert |
+--------------------------+--------------------+
| Zeichensatzclient | utf8mb4 |
| Zeichensatzverbindung | utf8mb4 |
| Zeichensatzdatenbank | utf8mb4 |
| Zeichensatz_Dateisystem | Binär |
| Zeichensatzergebnisse | utf8mb4 |
| Zeichensatzserver | utf8mb4 |
| Zeichensatzsystem | utf8 |
| Sortierverbindung | utf8mb4_unicode_ci |
| Sortierdatenbank | utf8mb4_unicode_ci |
| Sortierserver | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 Zeilen im Satz (0,008 Sek.)

Erklärung zu „character_set_filesystem“ und „character_set_system“

Anhand des oben dargestellten Zeichensatzes und der Sortierregeln können Sie erkennen, dass zwei Elemente nicht utf8mb4 sind.

  • character_set_filesystem sollte binär sein, es sei denn, Sie verwenden ein Dateisystem, das mehrbyte-UTF-8-codierte Zeichen in Dateinamen unterstützt.
  • character_set_system ist immer UTF-8 und kann nicht überschrieben werden.

Weitere Referenzen zu Zeichensatzeinstellungen

Die obigen Einstellungen sind bereits die richtigen, um utf8mb4 zu ändern. Nachfolgend sind einige mögliche zugehörige Einstellungen als Referenz aufgeführt (obwohl sie selten verwendet werden):

[Kunde]
Standardzeichensatz = utf8mb4

[mysql]
Standardzeichensatz = utf8mb4

[mysqld]
explicit_defaults_for_timestamp = 1 # Ich poste es hier als Tipp zum Deaktivieren der Zeitstempelnachricht, vielleicht hilft es jemandem :)
Zeichensatz-Client-Handshake = 0 # FALSCH
init_connect = 'SET Zeichensatzsystem = utf8mb4'
init_connect = "SET Zeichensatzverbindung = utf8mb4"
init_connect = 'SET Zeichensatzdatenbank = utf8mb4'
init_connect = 'SET Zeichensatzergebnisse = utf8mb4'
init_connect = 'SET-Sortierung_Datenbank = utf8mb4_unicode_ci'
init_connect = 'SET-Sortierung_Verbindung = utf8mb4_unicode_ci'
init_connect = "Namen festlegen utf8mb4"
Zeichensatzserver = utf8mb4
#Zeichensatzclient = utf8mb4
Sortierserver = utf8mb4_unicode_ci
Sortierverbindung = utf8mb4_unicode_ci
Sortierdatenbank = utf8mb4_unicode_ci

Mehrere init_connects können auch wie folgt festgelegt werden: init_connect = 'SET collation_connection = utf8mb4_unicode_ci,NAMES utf8mb4'. Nicht verifiziert

Der komplette Vorgang der Umstellung des Zeichensatzes einer bestehenden Datenbank auf utf8mb4

Wenn die Datenbank mit utf8mb4 erstellt wird, gibt es solche Probleme nicht! ! !

Schritt 1: Erstellen Sie eine Sicherungskopie aller Datenbanken auf dem zu aktualisierenden Server. Sicherheit geht vor!

Schritt 2: MySQL-Server aktualisieren. MySQL-Server auf v5.5.3+ aktualisieren. Wenn MySQL auf 8.0 aktualisiert wird, muss der MySQL-Serverzeichensatz in Schritt 5 nicht geändert werden. Der Standard ist utf8mb4. MariaDB muss auch den Zeichensatz ändern.

Schritt 3: Datenbank, Tabellen und Spalten ändern. Ändern Sie den Zeichensatz und die Sortiereigenschaften der Datenbank, Tabellen und Spalten, um utf8mb4 zu verwenden.

# Für jede Datenbank:
ALTER DATABASE Datenbankname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# Für jede Tabelle:
ALTER TABLE Tabellenname IN ZEICHENSATZ KONVERTIEREN utf8mb4 COLLATE utf8mb4_unicode_ci;
# Für jede Spalte:
ALTER TABLE Tabellenname CHANGE Spaltenname Spaltenname VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Nicht blind kopieren und einfügen! Die genaue Anweisung hängt vom Spaltentyp, der maximalen Länge und anderen Eigenschaften ab. Die obige Zeile ist nur ein Beispiel für eine `VARCHAR`-Spalte.)
# Oder Modefy-Anweisung ALTER TABLE Tabellenname MODIFY Spaltenname VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Schritt 4: Überprüfen der maximalen Länge von Spalten- und Indexschlüsseln

Dies ist wahrscheinlich der mühsamste Teil des gesamten Upgrade-Prozesses.

Bei der Konvertierung von UTF8 nach UTF8MB4 bleibt die maximale Länge einer Spalte oder eines Indexschlüssels in Bytes unverändert. Es fällt daher zeichenmäßig kleiner aus, da die maximale Länge eines Zeichens nun vier Bytes beträgt statt drei.

Beispielsweise kann eine TINYTEXT-Spalte bis zu 255 Bytes enthalten, was 85 Drei-Byte-Zeichen oder 63 Vier-Byte-Zeichen entspricht. Angenommen, Sie haben eine TINYTEXT-Spalte, die UTF-8 verwendet, aber mehr als 63 Zeichen enthalten können muss. Aufgrund dieser Anforderung können Sie diese Spalte nicht in utf8mb4 konvertieren, es sei denn, Sie ändern auch den Datentyp in einen längeren Typ wie beispielsweise TEXT. Denn wenn Sie versuchen, sie mit 4-Byte-Zeichen zu füllen, können Sie nur 63 Zeichen eingeben und nicht mehr.
Dasselbe gilt für Indexschlüssel. Die maximale Indexlänge für die InnoDB-Speicher-Engine beträgt 767 Bytes, sodass Sie für UTF8- oder UTF8MB4-Spalten jeweils bis zu 255 oder 191 Zeichen indizieren können. Wenn Sie derzeit Indizes für UTF-8-Spalten haben, die länger als 191 Zeichen sind, müssen Sie bei Verwendung von UTF-8MB4 eine geringere Anzahl von Zeichen indizieren. (Aus diesem Grund musste ich einige indizierte VARCHAR(255)-Spalten in VARCHAR(191) ändern.)

Schritt 5: Ändern der Verbindungs-, Client- und Server-Zeichensätze

Stellen Sie in Ihrem Anwendungscode den Verbindungszeichensatz auf utf8mb4 ein. Dies kann durch einfaches Ersetzen von SET NAMES utf8 durch SET NAMES utf8mb4 erfolgen. Gleichzeitig müssen auch die Sortierregeln entsprechend angepasst werden, zum Beispiel wird aus SET NAMES utf8 COLLATE utf8_unicode_ci SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci.

Stellen Sie sicher, dass Sie sowohl den Client- als auch den Server-Zeichensatz festlegen.

Die MySQL-Konfigurationsdatei (/etc/my.cnf) enthält Folgendes:

[Kunde]
Standardzeichensatz = utf8mb4

[mysql]
Standardzeichensatz = utf8mb4

[mysqld]
Zeichensatz-Client-Handshake = FALSE
Zeichensatzserver = utf8mb4
Sortierserver = utf8mb4_unicode_ci

Schritt 6: Reparieren und optimieren Sie alle Tabellen
Nachdem Sie Ihren MySQL-Server aktualisiert und die oben genannten erforderlichen Änderungen vorgenommen haben, achten Sie darauf, alle Datenbanken und Tabellen zu reparieren und zu optimieren. Andernfalls erhalten Sie möglicherweise seltsame Fehler, auch wenn kein Fehler ausgegeben wird.
Sie können die folgende MySQL-Abfrage für jede Tabelle ausführen, die Sie reparieren und optimieren möchten:

# Für jede Tabelle
REPARATURTABELLE Tabellenname;
TABELLE OPTIMIEREN Tabellenname;

Dies lässt sich ganz einfach in einem Durchgang mit dem Befehlszeilenprogramm mysqlcheck erledigen:

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

Daraufhin wird das Kennwort des Root-Benutzers abgefragt. Anschließend werden alle Tabellen in allen Datenbanken repariert und optimiert.

siehe

Die Hauptreferenz wurde übersetzt von: So unterstützen Sie vollständiges Unicode in MySQL-Datenbanken. Lesen Sie gerne den Originaltext.

Dies ist das Ende dieses Artikels zur vollständigen Unicode-Unterstützung in MySQL/MariaDB. Weitere Informationen zur Unicode-Unterstützung von MySQL/MariaDB finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder in Zukunft 123WORDPRESS.COM unterstützen wird!

Das könnte Sie auch interessieren:
  • Lösung für die Remoteverbindung zum MySQL-Fehlercode 1130
  • MySQL-Fehler 1130 hy000: Host „localhost“ Lösung
  • Lösung für MySQL-Verbindungsausnahme und Fehler 10061
  • Grafisches Tutorial zur Installation der MySQL-Datenbank und Konfiguration von Umgebungsvariablen auf dem Mac
  • Entwurf und Implementierung eines studentischen Clubmanagementsystems auf Basis von JavaSwing+MySQL
  • MySQL Multi-Instance-Bereitstellungs- und Installationshandbuch unter Linux
  • Detaillierter Prozess zur Bereitstellung von MySQL mit Docker (allgemeine Anwendungen, die mit Docker bereitgestellt werden)
  • MySQL 1130-Ausnahme, Remote-Anmeldung nicht möglich – Lösung

<<:  Mehrere Möglichkeiten zur Implementierung bildadaptiver Container mit CSS (Zusammenfassung)

>>:  Lösung für die leere Seite nach einem vue.js-gepackten Projekt

Artikel empfehlen

Bereinigungsmethode für das Docker-Verzeichnis /var/lib/docker/aufs/mnt

Der Dienst des Unternehmens verwendet Docker und ...

So verwenden Sie Port 80 in Tomcat unter Linux

Anwendungsszenario In vielen Fällen installieren ...

Eine kurze Diskussion über den VUE Uni-App-Lebenszyklus

Inhaltsverzeichnis 1. Anwendungslebenszyklus 2. S...

Detaillierte Erklärung der Docker-Datenspeichervolumes

Standardmäßig erfolgt das Lesen und Schreiben von...

So schreiben Sie eine Node.JS-Version eines Spiels

Inhaltsverzeichnis Überblick Build-Prozess Verwan...

So starten und starten Sie nginx unter Linux neu

Nginx (Engine x) ist ein leistungsstarker HTTP- u...

So implementieren Sie Web-Stresstests mit Apache Bench

1. Einführung in Apache Bench ApacheBench ist ein...

Zusammenfassung der Methode von React zum Erstellen von Komponenten

Inhaltsverzeichnis 1. Komponenten mit Funktionen ...

Die vue-cli-Konfiguration verwendet den vollständigen Prozessdatensatz von Vuex

Inhaltsverzeichnis Vorwort Installation und Verwe...

So installieren Sie MySQL in Docker

Ich habe kürzlich Django bereitgestellt und wollt...

Detailliertes Beispiel einer MySQL-Unterabfrage

Unterabfrageklassifizierung Klassifizierung nach ...