Kurz gesagt, weil das schon tausendmal diskutiert wurde:
- PHP enthält einen String, sagen wir
"漢字"
, kodiert in UTF-8. Die Bytes dafür sindE6 BC A2 E5 AD 97
. - Es sendet diesen String über eine Datenbankverbindung, die auf
latin1
eingestellt ist . - Die Datenbank erhält die Bytes
E6 BC A2 E5 AD 97
, weil ich denke, dass dieselatin1
repräsentieren Zeichen. - Die Datenbank speichert die Zeichen
æ¼¢å
(die Zeichen, dieE6 BC A2 E5 AD 97
entspricht inlatin1
). - 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.