Lösung für ein MySQL UTF-8 Umlautproblem

Heute Morgen stand ich mal wieder vor dem Supergau. Ein fehlerhafter Datenimport aufgrund verschiedener Datenbank Kollationen bewirkte unter anderem, dass sämtliche Umlaute in einer Tabelle wegen der UTF-8 Kodierung nur noch als Binärzeichen zu lesen waren. Für den unbedarften User standen da also irgendwelche kryptischen Zeichen auf dem Bildschirm, die nicht zu entschlüsseln waren.

Die Lösung des Problems ist denkbar einfach. Zunächst mal die Lösung auf PHP Grundlage. Rein theoretisch hätte ich jede Spalte Zeile für Zeile auslesen, mit einer while-Schleife abhandeln, die fehlerhaften Umlaute mittels str_replace ersetzen und ein entsprechendes UPDATE Statement zurück an die Datenbank senden können. So umständlich dieser Satz zu lesen ist, wäre auch die Lösung auf Grundlage von PHP. Ich als Entwickler bin auch grundsätzlich zu faul, um derart umständliche Wege zu gehen.

Vor einiger Zeit hat man mir in den Kopf geprügelt, dass ich es der Datenbank überlassen soll. Grundsätzlich kann die Datenbank sowas nämlich schneller. Glücklicherweise stellt MySQL die String Funktion REPLACE zur Verfügung. Mit dieser Funktion lassen sich Teile eines Strings sicher ersetzen. Also ist die Lösung denkbar einfach.

Letztendlich kam dann dieser Codeschnipsel zustande:

< ?php
 
$utf8Umlaute = array(
	'ä'	=> 'ä',
	'ö'	=> 'ö',
	'ü'	=> 'ü',
	'ß'	=> 'ß'
);
 
$fieldNames = array(
        'feldName_1',
        'feldName_2',
        'feldName_3'
);
 
foreach ($utf8Umlaute as $key => $value) {
        $sql = "
                UPDATE
                        " . TABLE_NAME . "
                SET ";
 
        $fieldAry = array();
        foreach ($fieldNames as $name) {
                $fieldAry[] = $name . " = REPLACE(" . $name . ", '" . $key . "', '" . $value . "')";
        }
        $sql .= implode(", ", $fieldAry);
        echo $sql;
}
 
?>

Hinweis: Dieser Codeschnipsel führt das Query für die Datenbank noch nicht aus. Das zusammengestellte Query wird in diesem Fall lediglich per echo am Ende ausgegeben. Für jeden deutschen Umlaut (hier nur die kleingeschriebenen) wird ein Query erstellt, welches die im Array $fieldNames festgehaltenen Felder aktualisiert.

About Author: Marcel
Ich bin Senior PHP Developer bei MM Newmedia. Seit 2005 bin ich begeisterter Webentwickler und arbeite als Freelancer für namenhafte Firmen und entwickle jede Menge abgefahrenes Zeug und berichte darüber in meinem Blog.

4 thoughts on “Lösung für ein MySQL UTF-8 Umlautproblem

Kommentar verfassen