“Falsche” Zeichen in der Datenbank mit MySQL wieder korrigieren
Jeder, der schon einmal mit einer Website und Datenbank umgezogen ist, kennt das Problem: Aus irgendeinem Grund wurden einzelne Zeichen in Wörtern, die Sonderzeichen oder Umlaute enthalten, in der falschen Kodierung beim Importieren der SQL-Datei in die Datenbank geschrieben. Das kann man daran erkennen, dass sich Zeichen wie diese untergemischt haben und im Backend oder auch auf der Website so angezeigt werden:
¦, ¨, ?, ´, ¸, À, Â, Ã, Ä, Ã…, Æ, Ç, È, É, Ê, Ë, ÃŒ, ÃŽ, Ñ, Ã’, Ó, Ô, Õ, Ö, Ø, Ù, Ú, Û, Ãœ, Þ, ß, à , á, â, ã, ä, Ã¥, æ, ç, è, é, ê, ë, ì, Ã, î, ï, ð, ñ, ò, ó, ô, õ, ö, ø, ù, ú, û, ý, þ, ÿ
Diese Zeichen sind nicht UTF-8 kodiert worden, werden aber als UTF-8 Zeichen dargestellt.
Das kann eine Vielzahl an Gründen haben.
Ändern der Datenbankverbindungs-Kodierung
Ein Problem, das zu falschen Einträgen von Umlauten und Sonderzeichen in der Datenbank führt, wäre möglicherweise in der Übertragung der Daten zur Datenbank zu finden. Diese sollte immer einmalig nach dem Öffnen der Datenbankverbindung auf UTF-8 gesetzt werden:
mysql_connect();
mysql_query("SET NAMES 'utf8'");
Man kann mit verschiedenen Funktionen mittels PHP die Zeichen nun wieder korrekt darstellen lassen, wie zum Beispiel mit if(mb_detect_encoding($string) != 'UTF-8') { $string = utf8_encode($string); }
Aber schöner wäre es ja, wenn die falschen Umlaute und Sonderzeichen in der Datenbank dauerhaft korrigiert würden. Dazu habe ich das folgende PHP-Script geschrieben:
MySQL PHP Umlaute/Sonderzeichen fixen UTF-8/ISO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> </head> <body> <?php $string = utf8_encode($string); /* internes character encoding auf UTF-8 setzen */ mb_internal_encoding("UTF-8"); /* aktuelles internes character encoding anzeigen */ echo mb_internal_encoding(); $db_host = "localhost"; // Host der Datenbank $db_user = "benutzer"; // Datenbank-User $db_pass = "passwort"; // Datenbank-Passwort $db_name = "datenbank"; // Name der Datenbank $db = mysql_connect($db_host,$db_user,$db_pass) or die(mysql_error()); mysql_query("SET NAMES 'utf8'"); mysql_select_db($db_name,$db) or die(mysql_error()); $show="SHOW TABLES FROM ".$db_name; $ergebnis=mysql_query($show) ; $qry = "Tables_in_".$db_name.""; $all_affected_rows = 0; //Variable zur Zählung aller betroffenen Datensätze /* Ersetze diese Zeichen (beliebig erweiterbar) */ $array_von = array('ü', 'ä', 'ö', 'Ö', 'ß', 'à ', 'á', 'â', 'ã', 'ù', 'ú', 'û', 'Ù', 'Ú', 'Û', 'Ãœ', 'ò', 'ó', 'ô', 'è', 'é', 'ê', 'ë', 'À', 'Â', 'Ã', 'Ä', 'Ã…', 'Ç', 'È', 'É', 'Ê', 'Ë', 'ÃŒ', 'ÃŽ', 'Ñ', 'Ã’', 'Ó', 'Ô', 'Õ', 'Ø', 'Ã¥', 'æ', 'ç', 'ì', 'Ã', 'î', 'ï', 'ð', 'ñ', 'õ', 'ø', 'ý', 'ÿ', '€'); /* zu diese Zeichen (beliebig erweiterbar) */ $array_nach = array('ü', 'ä', 'ö', 'Ö', 'ß', 'à', 'á', 'â', 'ã', 'ù', 'ú', 'û', 'Ù', 'Ú', 'Û', 'Ü', 'ò', 'ó', 'ô', 'è', 'é', 'ê', 'ë', 'À', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Î', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ø', 'å', 'æ', 'ç', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'õ', 'ø', 'ý', 'ÿ', '€'); $zaehlen=$show; $ergebnis_count=mysql_query($zaehlen); $num_rows = mysql_num_rows($ergebnis_count); echo "<br>Anzahl der Tabellen: ".$num_rows."<br>"; $anzahl=0; while($show = mysql_fetch_object($ergebnis)) { $anzahl++; echo "<br>".$anzahl.". Tabelle: ".$show->$qry; $db_table=$show->$qry; $query = "SHOW COLUMNS FROM `".$db_table."`"; // Query zur Ermittlung der Tabellenfelder $result = mysql_query($query); // Query ausführen und Ergebnis in $result schreiben if (mysql_errno() != 0){ echo mysql_error(); } // Gab es bei der Abfrage einen Fehler? Wenn ja, dann ausgeben else { $num = mysql_numrows($result); } // Ermitteln wie viele Datensätze gefunden wurden echo "<br>Anzahl der Spalten: ".$num."<br>"; if ($num > 0){ $query_update = "UPDATE ".$db_table." SET "; // Generiere Update-Query for($i=0;$i<$num;$i++){ // Durchlaufe Feldnamen $fieldname = mysql_result($result,$i,"Field"); for($x=0;$x<sizeof($array_von);$x++){ // Durchlaufe Ersetzungen $query_update .= "`".$fieldname."`=REPLACE(".$fieldname.", '".$array_von[$x]."', '".$array_nach[$x]."')"; if ((sizeof($array_von)-1) != $x){ $query_update .= ", "; } else if (($num-1) != $i){ $query_update .= ", "; } else if (($num-1) == $i){ $query_update .= ";"; } } } mysql_query($query_update); if (mysql_errno() != 0){ echo mysql_error(); } else { echo "------------- OK ------------- \n Betroffene Datensätze: ".mysql_affected_rows()."\n------------------------------ \n "; $all_affected_rows=$all_affected_rows+mysql_affected_rows(); } } } echo "------------- OK ------------- \n insgesamt betroffene Datensätze: ".$all_affected_rows."\n------------------------------ \n "; ?> </body> </html> |
In der Zeile 31 werden die falschen Umlaute und Sonderzeichen angegeben, in der Zeile 34 die korrigierten Zeichen. Diese beiden Arrays kannst du deinen Bedürfnissen anpassen. Hier kann natürlich alles gesucht und entsprechend ersetzt werden.
Achtung !!
Achte bitte darauf, vorher ein Backup der Datenbank anzulegen und prüfe, ob die Zeichen in den Arrays auch korrekt sind.
Auf die UTF-8 Kodierung des PHP-Scripts achten
Wenn du das Script in einer PHP-Datei speicherst, muss auch hier die Kodierung der PHP-Datei stimmen. Die Kodierung der PHP-Datei muss auch UTF-8 sein, sonst werden Umlaute auch falsch dargestellt oder falsch an die Datenbankabfrage übermittelt. Die Kodierung kann z.B. mit Notepad++ überprüft und verändert werden: Hauptmenü->Kodierung->UTF-8.
Thank you very much, you saved me quite some time searching for all the translations and writing something like this myself!
One more definition i stumbled across:
‘´’ => ‘´’
Hallo
Sensationell. Genau das hab ich gesucht. Bestes Script der Woche für mich! Vielen Vielen Lieben DANK!
RG.
Hi,
danke für deinen Kommentar.
Es freut mich, wenn ich damit helfen konnte ;)
Gruss Harry
Vielen Dank, du hast mir sehr geholfen!
Hallo Harry, Danke für den Script. Hat mit sehr geholfen da bei einer Forenmigration die Umlaute nicht passten. DB war zwar in UTF-8, Header auch i.O. aber Post-text in DB in latin abgespeichert.
Hallo,
danke für der script, unter php 5.6 funktioniert es, bei php 7.4 kommt die html Ausgabe nut bis “UTF-8”. Woran kann das liegen?
Gruß ré
Hi,
das liegt an
$db = mysql_connect($db_host,$db_user,$db_pass) or die(mysql_error());
und den Abfragenmysql_query("SET NAMES 'utf8'");
mysql_select_db($db_name,$db) or die(mysql_error());>
$ergebnis_count=mysql_query($zaehlen);
.$num_rows = mysql_num_rows($ergebnis_count);
Also alles was mit “mysql_” zu tun hat.
Das Script ist ja mittlerweile 6,5 Jahre alt und diese Teile musst du für PHP 7 anpassen.
Gruss Harry