Dieses Problem plagt die Teilnehmer dieser Site und viele andere.
Sie haben die fünf Hauptprobleme aufgelistet CHARACTER SET
.
Beste Übung
In Zukunft ist es am besten, CHARACTER SET utf8mb4
und zu verwenden COLLATION utf8mb4_unicode_520_ci
. (Es ist eine neuere Version der Unicode-Sortierung in der Pipeline.)
utf8mb4
ist eine Obermenge davon, utf8
dass es 4-Byte-utf8-Codes verarbeitet, die von Emoji und einigen Chinesen benötigt werden.
Außerhalb von MySQL bezieht sich "UTF-8" auf alle Größencodierungen, daher praktisch die gleichen wie bei MySQL utf8mb4
, nicht utf8
.
Ich werde versuchen, diese Schreibweisen und Großschreibungen zu verwenden, um im Folgenden innerhalb und außerhalb von MySQL zu unterscheiden.
Überblick darüber, was Sie tun sollten
- Stellen Sie Ihren Editor usw. auf UTF-8 ein.
- HTML-Formulare sollten wie folgt beginnen
<form accept-charset="UTF-8">
.
- Lassen Sie Ihre Bytes als UTF-8 codieren.
- Richten Sie UTF-8 als die im Client verwendete Codierung ein.
- Lassen Sie die Spalte / Tabelle deklarieren
CHARACTER SET utf8mb4
( überprüfen mit SHOW CREATE TABLE
.)
<meta charset=UTF-8>
am Anfang von HTML
- Gespeicherte Routinen erfassen den aktuellen Zeichensatz / die aktuelle Sortierung. Sie müssen möglicherweise neu aufgebaut werden.
UTF-8 bis zum Ende
Weitere Details zu Computersprachen (und den folgenden Abschnitten)
Testen Sie die Daten
Das Anzeigen der Daten mit einem Tool oder mit SELECT
kann nicht als vertrauenswürdig eingestuft werden. Zu viele solcher Clients, insbesondere Browser, versuchen, falsche Codierungen zu kompensieren und zeigen Ihnen korrekten Text an, selbst wenn die Datenbank beschädigt ist. Wählen Sie also eine Tabelle und eine Spalte mit nicht englischem Text aus und tun Sie dies
SELECT col, HEX(col) FROM tbl WHERE ...
Das HEX für korrekt gespeichertes UTF-8 ist
- Für ein Leerzeichen (in einer beliebigen Sprache):
20
- Für Englisch:
4x
, 5x
, 6x
, oder7x
- Für den größten Teil Westeuropas sollten Buchstaben mit Akzent verwendet werden
Cxyy
- Kyrillisch, Hebräisch und Persisch / Arabisch:
Dxyy
- Der größte Teil Asiens:
Exyyzz
- Emoji und einige Chinesen:
F0yyzzww
- Mehr Details
Spezifische Ursachen und Lösungen für die aufgetretenen Probleme
Abgeschnittener Text ( Se
für Señor
):
- Die zu speichernden Bytes werden nicht als utf8mb4 codiert. Repariere das.
- Überprüfen Sie außerdem, ob die Verbindung während des Lesens UTF-8 ist.
Schwarze Diamanten mit Fragezeichen ( Se�or
für Señor
); Einer dieser Fälle liegt vor:
Fall 1 (ursprüngliche Bytes waren nicht UTF-8):
- Die zu speichernden Bytes werden nicht als utf8 codiert. Repariere das.
- Die Verbindung (oder
SET NAMES
) für das INSERT
und das SELECT
war nicht utf8 / utf8mb4. Repariere das.
- Überprüfen Sie außerdem, ob die Spalte in der Datenbank
CHARACTER SET utf8
(oder utf8mb4) lautet.
Fall 2 (ursprüngliche Bytes waren UTF-8):
- Die Verbindung (oder
SET NAMES
) für das SELECT
war nicht utf8 / utf8mb4. Repariere das.
- Überprüfen Sie außerdem, ob die Spalte in der Datenbank
CHARACTER SET utf8
(oder utf8mb4) lautet.
Schwarze Diamanten treten nur auf, wenn der Browser auf eingestellt ist <meta charset=UTF-8>
.
Fragezeichen (normale, keine schwarzen Diamanten) ( Se?or
für Señor
):
- Die zu speichernden Bytes werden nicht als utf8 / utf8mb4 codiert. Repariere das.
- Die Spalte in der Datenbank ist nicht
CHARACTER SET utf8
(oder utf8mb4). Repariere das. (Verwenden SHOW CREATE TABLE
.)
- Überprüfen Sie außerdem, ob die Verbindung während des Lesens UTF-8 ist.
Mojibake ( Señor
für Señor
): (Diese Diskussion gilt auch für die Doppelkodierung , die nicht unbedingt sichtbar ist.)
- Die zu speichernden Bytes müssen UTF-8-codiert sein. Repariere das.
- Die Verbindung wann
INSERTing
und SELECTing
Text muss utf8 oder utf8mb4 angeben. Repariere das.
- Die Spalte muss deklariert werden
CHARACTER SET utf8
(oder utf8mb4). Repariere das.
- HTML sollte mit beginnen
<meta charset=UTF-8>
.
Wenn die Daten korrekt aussehen, aber nicht korrekt sortiert werden, haben Sie entweder die falsche Sortierung ausgewählt oder es gibt keine Kollatierung, die Ihren Anforderungen entspricht, oder Sie haben die doppelte Codierung .
Die doppelte Codierung kann durch Ausführen der SELECT .. HEX ..
oben beschriebenen Schritte bestätigt werden .
é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
Das heißt, das Hex ist ungefähr doppelt so lang wie es sein sollte. Dies wird verursacht, indem von latin1 (oder was auch immer) nach utf8 konvertiert wird, diese Bytes dann so behandelt werden, als wären sie latin1, und die Konvertierung wiederholt wird. Das Sortieren (und Vergleichen) funktioniert nicht richtig, da beispielsweise so sortiert wird, als ob die Zeichenfolge wäre Señor
.
Daten nach Möglichkeit korrigieren
Bei Kürzungen und Fragezeichen gehen die Daten verloren.
Für Mojibake / Double Encoding ...
Für schwarze Diamanten ...
Die Fixes sind hier aufgelistet. (5 verschiedene Korrekturen für 5 verschiedene Situationen; sorgfältig auswählen): http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
utf8mb4
ich Emojis problemlos speichern. Einige Blogs empfehlen auch das Einstellencollation-server
undcharacter-set-server
in mysqld. Muss ich wirklich ändern,mysqld
welchen Unterschied die Servereinstellungen machen?