MySQL Charset gerade biegen

Ein Kunde hat eine MySQL-Tabelle, in der alle Felder sauber mit Charset utf8_general_ci angelegt wurden.

Leider hat die PHP-Anwendung, die in die Tabelle schreibt, Daten in ISO 8859-1 in die Tabelle geschrieben; was dazu geführt hat, dass die Anwendung die Daten sauber lesen und schreiben konnte, andere Programme aber nicht. Diese gingen nämlich davon aus, dass die Daten in einem UTF-8 Feld auch in UTF-8 gespeichert sind.

Die anderen Programme haben z.B. „ä“ statt eines „ä“, oder statt eines „ß“ die Zeichen „ß“ ausgelesen. Auch in PHPMyAdmin waren die Zeichen „fehlerhaft“ dargestellt.

Eine Entstörung des Problems lief in zwei Schritten ab:

  • Anpassen der PHP-Anwendung, dass diese immer UTF-8 zum Lesen und Schreiben benutzt
  • Anpassen der Datenbank, dass die Daten auch korrekt in dieser hinterlegt sind

Für die PHP-Anwendung reichte es, in PDO ein ;charset=utf8 an den Query-String zu hängen:

new \PDO('mysql:host=HOST;dbname=DB;charset=utf8mb4', 'user', 'pass');

Die Anwendung war nun nicht mehr funktionsfähig, da die Daten aus der Tabelle nun auch für unsere Anwendung falsch kodiert waren. Nächster Schritt war also die Konvertierung der Datenbank.

Nach einem Backup der Datenbank dumpen wir die Datenbank als Latin1 (= das oben genannte ISO 8859-1)

mysqldump --user=user --password=pass --default-character-set=latin1 --skip-set-charset db > dump.sql

Nun wandeln wir die Datei mit sed von Latin1 zu UTF-8 um

sed -i 's/latin1/utf8/g' dump.sql

Und importieren die Datei wieder als UTF-8

mysql --user=user --password=pass --default-character-set=utf8 db < dump.sql

Blick in die Datenbank via PHPMyAdmin sollte nun Umlaute korrekt zeigen. Die Datenbank sollte nun wieder die Felder korrekt abrufen können.

Quelle für diesen Teil des Beitrages; der sed-Befehl leicht abgewandelt, denn mit Tüddelchen hat der bei mir nicht geklappt, ohne dafür umso besser

Kategorien: PHP, Software

tino-ruge.de wird tino-kuptz.de

Im Laufe des Jahres 2024 wird dieser Blog umziehen. Alle Inhalte werden 1:1 weitergeleitet, nix geht verloren. Neue Domain, alter Autor, alter Inhalt.