Allgemeine Informationen zu Elektronik, Platinen, Programmierung, PCs und mehr...

von   am   | 7 Kommentare | aktualisiert am  | 8088 mal gelesen
122 mal als PDF heruntergeladen

MySQL PHP Umlaute und Sonderzeichen in UTF-8

   mysql php umlaute und sonderzeichen utf-8

Suchen und Ersetzen von unerwünschten Zeichen in der Datenbank

mysql php umlaute und sonderzeichen utf-8

 

“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

<!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.
 



Bewerte den Artikel, wenn du magst:
[Gesamt: 23 Durchschnitt: 4.9/5]

7 Kommentare

  1. Michael

    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:
    ‘´’ => ‘´’

    [yasr_comments_votes size='small']
  2. RG

    Hallo

    Sensationell. Genau das hab ich gesucht. Bestes Script der Woche für mich! Vielen Vielen Lieben DANK!

    RG.

    [yasr_comments_votes size='small']
  3. Harry Milatz

    Hi,

    danke für deinen Kommentar.

    Es freut mich, wenn ich damit helfen konnte ;)

    Gruss Harry

    [yasr_comments_votes size='small']
  4. B. Teuber

    Vielen Dank, du hast mir sehr geholfen!

    [yasr_comments_votes size='small']
  5. Stefan Kaufmann

    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.

    [yasr_comments_votes size='small']
  6. rene

    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é

    [yasr_comments_votes size='small']
    • Harry Milatz

      Hi,
      das liegt an $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());>
      und den Abfragen $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

      [yasr_comments_votes size='small']

Kommentar verfassen

Du kannst auch mit einem deiner folgenden Profile kommentieren*:


* Zustimmung zur Datenschutzerklärung
Dieses Kommentarformular speichert Name, E-Mailadresse und Inhalt, sowie die IP-Adresse für maximal 60 Tage. Für detaillierte Informationen lies bitte unsere Datenschutzerklärung.
*

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert. - HTML ist erlaubt.Du kannst folgende HTML Tags und Attribute benutzen:
<a href="" title=""> <abbr title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strong> <pre style=""> <span style=""> .

Top
green

BILDSCHIRM OFF.
SPAREN ON!

Ein dunkler Monitor verbraucht im Gegensatz zu einem hellen bis zu 20% weniger Strom.
Daher spare ich jetzt Energie für dich.

Harrys Welt