Doppelt kodierte UTF-8-Zeichen in MySQL berichtigen

Herausforderung: In einer MySQL-Datenbank befindet sich Text, der doppelt in UTF-8 kodiert ist, d.h. bei dem nicht-ASCII-Zeichen als zwei oder mehr Zeichen angezeigt werden. Ein solcher Text könnte z.B. so aussehen: "… Unsere Büros in Genf …".

Geschehen kann dies, wenn sich eine Software die Mühe macht, Text in UTF-8 zu kodieren, der bereits als UTF-8 vorlag. Solange diese Software jeweils beim Zugriff auf die Datenbank auch wieder eine Dekodierung macht, muss dies nicht weiter auffallen – bis die Datenbank für einen anderen Zweck oder mit einer neueren Software-Version genutzt wird.

Glücklicherweise kann MySQL von Haus aus ein solches Problem beheben.

Nehmen wir an, dass in einer Datenbank namens testdb eine Tabelle namens content existiert, und in dieser Tabelle ein Feld bodytext, das doppelt kodierten Text enthält. Dann lässt sich mit

mysql -e \
 'UPDATE content SET bodytext = CONVERT(CAST(CONVERT(bodytext USING latin1) AS BINARY) USING utf8);' \
 testdb

in der ganzen Tabelle der Inhalt von bodytext berichtigen. Je nachdem, welcher Zeichensatz irrtümlich verwendet wurde, kann sich die CONVERT-Anweisung entsprechend ändern. Hier haben wir ISO8859-1 (Latin1) verwendet.