Niko: MySQL: Alles nach UTF-8 Umwandeln

Hallo zusammen,

Ich hatte vor kurzem bei meinem Webseitenprojekt das Problem, dass spezielle Zeichen wie zb € nicht angezeigt werden.Nun habe ich heute das komplette Projekt auf UTF-8 umgestellt, also alle Header geändert und das Encoding der Dateien umgestellt.

Jo es läuft auch ganz gut, also die Sonderzeichen werden jetzt richtig angezeigt, nur es gibt jetzt ein Problem mit der Datenbank! Scheinbar sind dort Daten in einem anderen Encoding als UTF-8 gespeichert und die führen jetzt zu <?> , wo eigentlich Umlaute wie ü oä. stehen sollten.

Jetzt die Frage: Wie kann ich alle Zeichenketten in meiner Datenbank sicher ins UTF-8 Format umwandeln??

Allerdings muss ich sagen, dass mich das wundert, da ich eigentlich bei der Datenbank als "Kollation" überall "utf8_general_ci" angegeben habe. Steckt da vlt noch was anderes dahinter?

Wie man vlt merkt kenne ich mich in der Beziehung überhaupt nicht aus. ;) Also hoffe ihr könnt mir helfen.

Lg Niko

  1. echo $begrüßung;

    Wie kann ich alle Zeichenketten in meiner Datenbank sicher ins UTF-8 Format umwandeln??

    Wenn die Daten in den Feldern tatsächlich in der dafür angegebenen Kodierung drinstehen, dann muss sie der phpMyAdmin korrekt anzeigen. Wenn nicht, hast du ein Problem. Um dafür Lösungsvorschläge zu bekommen, musst du genau hinschauen und angeben, wie so ein Nicht-ASCII-Zeichen aussieht.

    Wenn also der Feldinhalt korrekt ist, musst du nur die Kodierungsangabe des Feldes ändern, dann rechnet MySQL auch die Kodierung des Inhalts um.

    Allerdings muss ich sagen, dass mich das wundert, da ich eigentlich bei der Datenbank als "Kollation" überall "utf8_general_ci" angegeben habe. Steckt da vlt noch was anderes dahinter?

    Möglicherweise eine nicht ausgehandelte Kodierungsangabe auf der Verbindung von deinem Client zum MySQL-Server.

    echo "$verabschiedung $name";

    1. Danke erstmal für die Antworten! :)

      Da bis jetzt noch nicht viele Daten in der DB stehen habe ich es "per Hand" geändert, also eine (UTF-8) PHP-Datei geschrieben, mit der ich die problematischen Datenbankeinträge geändert habe. Allerdings besteht jetzt das Problem, dass phpMyAdmin die Zeichen nicht mehr richtig anzeigt, was fürs nachträgliche Bearbeiten schlecht ist!

      Darf ich Raten? War es ein Typo3-Projekt?

      Falsch! Ich bin dabei mein eigenes CMS zu schreiben. ;)

      Wenn die Daten in den Feldern tatsächlich in der dafür angegebenen Kodierung drinstehen, dann muss sie der phpMyAdmin korrekt anzeigen. Wenn nicht, hast du ein Problem. Um dafür Lösungsvorschläge zu bekommen, musst du genau hinschauen und angeben, wie so ein Nicht-ASCII-Zeichen aussieht.

      Ok ich habe dann wohl ein Problem! Bei mir schaut es etwa so aus:
      Klick mich

      Lg Niko

      1. echo $begrüßung;

        Da bis jetzt noch nicht viele Daten in der DB stehen habe ich es "per Hand" geändert, also eine (UTF-8) PHP-Datei geschrieben, mit der ich die problematischen Datenbankeinträge geändert habe. Allerdings besteht jetzt das Problem, dass phpMyAdmin die Zeichen nicht mehr richtig anzeigt, was fürs nachträgliche Bearbeiten schlecht ist!
        Klick mich

        Dann hast du den Fehler gemacht, auf deiner Verbindung keine Kodierungsangabe festgelegt zu haben, MySQLs Default-Wert auf Latin1 stehen zu haben, die Daten trotzdem als UTF-8 gesendet zu haben, was der MySQL aber als Latin1 angesehen hat. Er betrachtet nun jedes Byte einer UTF-8-Nicht-ASCII-Sequenz als eigenes Latin1-Zeichen und kodiert diese einzelnen Zeichen auch entsprechend um, wenn jemand eine andere Kodierung wünscht (der PMA beispielsweise).

        Eine Lösung wäre, alles zu exportieren (DROP TABLE ankreuzen nicht vergessen). Wenn PHP mit iconv-Extension (oder zur Not recode) ausgestattet ist, dann sollte beim Export eine Kodierungsangabe wählbar sein. Dort iso-8859-1 wählen. (Alternativ, wenn keine Kodierungsangabe beim Export zu machen geht, Datei in einem UTF-8-fähigen Editor als UTF-8-kodiert öffnen, und als ISO-8859-1 speichern.) Import-Funktion wählen, da aber utf-8 angeben. Umlaute kontrollieren. Alle PHP-Scripte, die UTF-8-kodierte Daten senden korrigieren und nach jedem Verbindungsaufbau mysql(i)_set_charset() ausführen oder ein SET NAMES Statement absetzen.

        echo "$verabschiedung $name";

        1. Das hat geklappt! Vielen Dank!

          Lg Niko

  2. Hallo!

    Ich hatte vor kurzem bei meinem Webseitenprojekt das Problem, dass spezielle Zeichen wie zb € nicht angezeigt werden.

    Darf ich Raten? War es ein Typo3-Projekt?

    Jetzt die Frage: Wie kann ich alle Zeichenketten in meiner Datenbank sicher ins UTF-8 Format umwandeln?

    Ich hatte das vor kurzem bei einem Projekt mit MySQL. Es gibt viele Infos, unter anderem TIP Convert latin1 to UTF-8 in MySQL.

    Hat aber alles nicht wirklich geholfen. Das einzige was lief war, dass ich eine zweite Datenbank angelegt habe, mit der Struktur der bestehenden. Dann habe ich ein Script geschrieben welches die Daten aus der bestehenden Datenbank ausliest, in UTF-8 umgewandelt und in die neue Datenbank schreibt.

    André Laugks

    1. echo $begrüßung;

      Jetzt die Frage: Wie kann ich alle Zeichenketten in meiner Datenbank sicher ins UTF-8 Format umwandeln?

      Ich hatte das vor kurzem bei einem Projekt mit MySQL. Es gibt viele Infos, unter anderem TIP Convert latin1 to UTF-8 in MySQL.

      In dem Artikel sind einige überflüssige Schritte enthalten. Er fängt auch schon falsch an. Das Default-Charset ist immer noch Latin1. Nur bei Gentoo hatte man irgendwann mal die Konfiguration auf UTF-8 umgestellt, wenn man nicht mit dem USE-Flag latin1 installierte.

      Aktuelle Ausgaben des Tools mysqldump schreiben an den Anfang der Datei, welche Zeichenkodierung vorliegt. Die wird beim Importieren berücksichtigt. Man muss damit weder beim Export noch beim Import zeichenkodierungsrelevante Optionen angeben und das Konvertieren des Dumps ist auch überflüssig. Wenn ich mich recht erinnere, war das aber noch nicht seit Beginn (= 4.1) so.

      Der phpMyAdmin schreibt keine Zeichenkodierungsinformation in seine Export-Daten. Hier muss man beim Import immer die zum Export verwendete Kodierung angeben.

      Kommt man von einer Version 4.0 oder kleiner, hat man einen Latin1-kodierten Dump vorliegen. Beim Importieren gibt man das mit --default-character-set=latin1 an und fertig ist.

      Möchte man die Kodierung der Felder umstellen, ändert man nur deren Kodierungsangabe. MySQL kodiert dabei selbständig um. Solange die alte Kodierungsangabe auch mit dem Inhalt übereingestimmt hat, gibt es dabei keine Probleme (wenn in der Zielkodierung alle Zeichen darstellbar sind).

      Ansonsten ist man mit zwei einfachen Regeln problemfrei: Mit der gewählten Kodierung für ein Feld muss man alle gewünschten Zeichen darstellen können. Wenn ein Client mit dem Server kommunizieren will, sollte er die zu verwendende Kodierung nach dem Verbindungsaufbau explizit aushandeln.

      echo "$verabschiedung $name";

      1. Hallo!

        In dem Artikel sind einige überflüssige Schritte enthalten. Er fängt auch schon falsch an. Das Default-Charset ist immer noch Latin1. Nur bei Gentoo hatte man irgendwann mal die Konfiguration auf UTF-8 umgestellt, wenn man nicht mit dem USE-Flag latin1 installierte.

        Mag sein! Diese Method ehatte ich nie probiert.

        Möchte man die Kodierung der Felder umstellen, ändert man nur deren Kodierungsangabe. MySQL kodiert dabei selbständig um. Solange die alte Kodierungsangabe auch mit dem Inhalt übereingestimmt hat, gibt es dabei keine Probleme (wenn in der Zielkodierung alle Zeichen darstellbar sind).

        Das währe schön gewesen wenn das so einfach funktioniert hätte! Tat es aber nicht. Erst mit meiner gewählten Methode, hatte ich Erfolg.

        André Laugks