Dieses Problem plagt die Teilnehmer dieser Seite und viele andere.
Sie haben die fünf Hauptfälle von CHARACTER SET
aufgelistet Probleme.
Best Practice
In Zukunft ist es am besten, CHARACTER SET utf8mb4
zu verwenden und COLLATION utf8mb4_unicode_520_ci
. (Eine neuere Version der Unicode-Sortierung ist in Vorbereitung.)
utf8mb4
ist eine Obermenge von 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, also praktisch dasselbe wie utf8mb4
von MySQL , nicht utf8
.
Ich werde versuchen, diese Schreibweisen und Großschreibungen zu verwenden, um im Folgenden zwischen MySQL innerhalb und außerhalb zu unterscheiden.
Überblick darüber, was Sie sollten tun
- Lassen Sie Ihren Editor usw. auf UTF-8 einstellen.
- HTML-Formulare sollten wie folgt beginnen:
<form accept-charset="UTF-8">
. - Lass deine Bytes als UTF-8 kodieren.
- Legen Sie UTF-8 als Codierung fest, die im Client verwendet wird.
- Die Spalte/Tabelle als
CHARACTER SET utf8mb4
deklarieren lassen (Überprüfen Sie mitSHOW CREATE TABLE
.) <meta charset=UTF-8>
am Anfang von HTML- Gespeicherte Routinen übernehmen den aktuellen Zeichensatz/die aktuelle Sortierung. Möglicherweise müssen sie neu aufgebaut werden.
Weitere Details zu Computersprachen (und die folgenden Abschnitte)
Testen Sie die Daten
Anzeigen der Daten mit einem Tool oder mit SELECT
kann nicht vertraut werden. Zu viele solcher Clients, insbesondere Browser, versuchen, falsche Kodierungen zu kompensieren und Ihnen korrekten Text anzuzeigen, selbst wenn die Datenbank beschädigt ist. Wählen Sie also eine Tabelle und Spalte mit nicht englischem Text und tun Sie es>
SELECT col, HEX(col) FROM tbl WHERE ...
Das HEX für korrekt gespeichertes UTF-8 lautet
- Für ein Leerzeichen (in jeder Sprache):
20
- Für Englisch:
4x
,5x
,6x
, oder7x
- Für die meisten westeuropäischen Länder sollten Buchstaben mit Akzent
Cxyy
sein - Kyrillisch, Hebräisch und Farsi/Arabisch:
Dxyy
- Großteil Asiens:
Exyyzz
- Emoji und einige chinesische:
F0yyzzww
- Weitere Details
Spezifische Ursachen und Behebungen der aufgetretenen Probleme
Abgeschnitten Text (Se
für Señor
):
- Die zu speichernden Bytes sind nicht als utf8mb4 kodiert. Beheben Sie das.
- Überprüfen Sie außerdem, dass 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 sind nicht als utf8 kodiert. Beheben Sie das.
- Die Verbindung (oder
SET NAMES
) fürINSERT
und dieSELECT
war nicht utf8/utf8mb4. Beheben Sie das. - Prüfen Sie außerdem, ob die Spalte in der Datenbank
CHARACTER SET utf8
ist (oder utf8mb4).
Fall 2 (ursprüngliche Bytes waren UTF-8):
- Die Verbindung (oder
SET NAMES
) fürSELECT
war nicht utf8/utf8mb4. Beheben Sie das. - Prüfen Sie außerdem, ob die Spalte in der Datenbank
CHARACTER SET utf8
ist (oder utf8mb4).
Schwarze Rauten treten nur auf, wenn der Browser auf <meta charset=UTF-8>
eingestellt ist .
Fragezeichen (normale, keine schwarzen Diamanten) (Se?or
für Señor
):
- Die zu speichernden Bytes sind nicht als utf8/utf8mb4 kodiert. Beheben Sie das.
- Die Spalte in der Datenbank ist nicht
CHARACTER SET utf8
(oder utf8mb4). Repariere das. (Verwenden SieSHOW CREATE TABLE
.) - Überprüfen Sie außerdem, dass die Verbindung während des Lesens UTF-8 ist.
Moji-Gebäck (Señor
für Señor
):(Diese Diskussion gilt auch für Double Encoding , was nicht unbedingt sichtbar ist.)
- Die zu speichernden Bytes müssen UTF-8-kodiert sein. Beheben Sie das.
- Die Verbindung beim
INSERTing
undSELECTing
text muss utf8 oder utf8mb4 angeben. Beheben Sie das. - Die Spalte muss als
CHARACTER SET utf8
deklariert werden (oder utf8mb4). Beheben Sie das. - HTML sollte mit
<meta charset=UTF-8>
beginnen .
Wenn die Daten richtig aussehen, aber nicht richtig sortiert werden, haben Sie entweder die falsche Sortierung ausgewählt, oder es gibt keine Sortierung, die Ihren Anforderungen entspricht, oder Sie haben eine doppelte Codierung .
Doppelte Codierung kann mit SELECT .. HEX ..
bestätigt werden oben beschrieben.
é should come back C3A9, but instead shows C383C2A9
The Emoji 👽 should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
Das heißt, das Hex ist etwa doppelt so lang wie es sein sollte. Dies wird verursacht, indem von latin1 (oder was auch immer) in 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 korrekt funktionieren, weil es zum Beispiel so sortiert wird, als ob die Zeichenfolge Señor
wäre .
Korrektur der Daten, wo möglich
Für Abschneiden und Fragezeichen , gehen die Daten verloren.
Für Mojibake / Doppelte Codierung , ...
Für Schwarze Diamanten , ...
Die Korrekturen sind hier aufgelistet. (5 verschiedene Fixes für 5 verschiedene Situationen; sorgfältig auswählen):http://mysql. rjweb.org/doc.php/charcoll#fixes_for_various_cases