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

Aktualisieren von Daten in der MySQL-Datenbank nach dem Einfügen in die falsche Codierung

Sie leiden unter "doppelter Kodierung".

Folgendes ist passiert.

  • Der Client hatte Zeichen, die als utf8 kodiert waren; und
  • SET NAMES latin1 gelogen, indem er behauptete, der Client habe eine latin1-Kodierung; und
  • Die Spalte in der Tabelle deklariert CHARACTER SET utf8 .

Sehen wir uns an, was mit e-acute passiert:é .

  1. Das Hex dafür ist in utf8 2 Bytes:C3A9 .
  2. SET NAMES latin1 sah es als 2 latin1-codierte Zeichen à und © (hex:C3 und A9 )
  3. Da das Ziel CHARACTER SET utf8 war , diese 2 Zeichen mussten umgewandelt werden.Ã wurde in utf8 konvertiert (hex C383 ) und © (hex C2A9 )
  4. Also wurden 4 Bytes gespeichert (hex C383C2A9 )

Beim erneuten Auslesen wurden die umgekehrten Schritte durchgeführt, und der Endbenutzer hat möglicherweise nichts Falsches bemerkt. Was ist falsch:

  • Die gespeicherten Daten sind doppelt so groß wie sie sein sollten (dreimal für asiatische Sprachen).
  • Vergleiche für gleich, größer als usw. funktionieren möglicherweise nicht wie erwartet.
  • ORDER BY funktioniert möglicherweise nicht wie erwartet.

So etwas wird Ihre Daten reparieren:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin1)) USING utf8);

Weitere Diskussionen und Weitere Beispiele zur Behebung