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

seltsame Zeichencodierung gespeicherter Daten, altes Skript zeigt sie gut an, neues nicht

Kurz gesagt, weil das schon tausendmal diskutiert wurde:

  1. PHP enthält einen String, sagen wir "漢字" , kodiert in UTF-8. Die Bytes dafür sind E6 BC A2 E5 AD 97 .
  2. Es sendet diesen String über eine Datenbankverbindung, die auf latin1 eingestellt ist .
  3. Die Datenbank erhält die Bytes E6 BC A2 E5 AD 97 , weil ich denke, dass diese latin1 repräsentieren Zeichen.
  4. Die Datenbank speichert die Zeichen æ¼¢å­ (die Zeichen, die E6 BC A2 E5 AD 97 entspricht in latin1 ).
  5. Der gleiche umgekehrte Prozess lässt PHP dieselben Bytes empfangen, die es dann als UTF-8 behandelt. Der Roundtrip funktioniert gut für PHP, obwohl die Datenbank die Zeichen nicht so behandelt, wie sie sollte.

Das Problem hier war also, dass die Datenbankverbindung beim Eintragen der Daten in die Datenbank falsch gesetzt wurde. Sie müssen die Daten in der Datenbank in die richtigen Zeichen umwandeln. Versuchen Sie Folgendes:

SELECT CONVERT(BINARY CONVERT(field_name USING latin1) USING utf8) FROM table_name

Vielleicht utf8 ist nicht das, was Sie hier brauchen, experimentieren Sie. Wenn das funktioniert, ändern Sie dies in ein UPDATE Anweisung, die Daten permanent zu aktualisieren.