Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Probleme mit UTF-8-Zeichen; Was ich sehe, ist nicht das, was ich gespeichert habe

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 mit SHOW 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.

UTF- 8 ganz durch

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 , oder 7x
  • 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ür INSERT und die SELECT 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ür SELECT 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 Sie SHOW 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 und SELECTing 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