Michi: phpMyAdmin 2.9 UTF-8 und Umlaute

Hallo,

kann mir bitte jemand dabei helfen meinen phpmyadmin (2.9.1.1) dazu zu bringen, Umlaute (Sonderzeichen) richtig darzustellen?
Ich verwende mysql 4.1.16 (MySQL-Zeichensatz: UTF-8 Unicode (utf8), Zeichensatz / Kollation der MySQL-Verbindung: utf-8_unicode_ci), OS ist WinXP.

In DBs in der alle Tabellen und Spalten ebenfalls auf utf-8_unicode_ci eingestellt sind, werden mir die Inhalte falsch dargestellt, z.B. werden äüöß zu äüöß

Da ansonsten keine fehlerhaften Darstellungen auftreten (z.B. wenn ich die Inhalte mittels PHP und/oder AJAX in utf-8 codierten HTML ausgebe), gehe ich davon aus, dass das Problem von meinem phpmyadmin her rührt.

Vielen Dank und viele Grüße

Michi

  1. echo $begrüßung;

    kann mir bitte jemand dabei helfen meinen phpmyadmin (2.9.1.1) dazu zu bringen, Umlaute (Sonderzeichen) richtig darzustellen?
    Ich verwende mysql 4.1.16 (MySQL-Zeichensatz: UTF-8 Unicode (utf8), Zeichensatz / Kollation der MySQL-Verbindung: utf-8_unicode_ci), OS ist WinXP.
    In DBs in der alle Tabellen und Spalten ebenfalls auf utf-8_unicode_ci eingestellt sind, werden mir die Inhalte falsch dargestellt, z.B. werden äüöß zu äüöß
    Da ansonsten keine fehlerhaften Darstellungen auftreten (z.B. wenn ich die Inhalte mittels PHP und/oder AJAX in utf-8 codierten HTML ausgebe), gehe ich davon aus, dass das Problem von meinem phpmyadmin her rührt.

    Ich gehe eher davon aus, dass das Problem auf einer nicht korrekt ausgehandelten Kodierung beruht, die für die Verbindung zwischen MySQL und deinen Anwendungen verwendet werden soll. Vermutlich steht diese auf Latin1/ISO-8859-1. Das hat zur Folge, dass du UTF-8-Daten sendest, MySQL annimmt, ISO-8859-1 zu bekommen, das nach UTF-8 umwandelt, um es in den Tabellenfeldern zu speichern. Bei der Ausgabe wandelt es das wieder nach ISO-8859-1 um, und du stellst es als UTF-8 dar.

    Der phpMyAdmin macht es richtig - ich konnte ihm diesbezüglich noch keinen Fehler nachweisen. Er legt mit SET NAMES utf8 explizit fest, dass er sich UTF-8-kodiert mit der Datenbank unterhalten möchte. Deine verkodierten Daten kann er dnn nur so darstellen. Als kleinen Test, dass es so ist, kannst du mal von einem so verkehrt dargestellten String bekannter Länge LENGTH() und CHAR_LENGTH() aus. LENGTH() liefert die Anzahl Bytes, CHAR_LENGTH() die Anzahl der Zeichen - wenn die Kodierung stimmt. Ein korrekt UTF-8-kodiertes "Müller" hat beispielsweise eine LENGTH() von 7 und eine CHAR_LENGTH() von 6. Du wirst wahrscheinlich pro Umlaut von LENGTH() 4 Bytes angezeigt bekommen. Ein weiterer Test: Gib im phpMyAdmin einen Umlaut ein, er wird darin richtig dargestellt werden, aber in deiner Anwendung nicht.

    Wenn meine Annahme stimmt, müsstest du zum einen deiner Anwendung beibringen, SET NAMES utf8 direkt nach einem Verbindungsaufbau zu senden und zum anderen deine fehlerhaften Daten in den Tabellen korrigieren. Du könntest dazu deine Daten auf die bisher falsche Art auslesen, und sie diesmal mit SET NAMES utf8 wieder einlesen. Alternativ kannst du die Daten unter Verwendung von phpMyAdmin in eine Datei exportieren, diese Datei mit einem extern Programm einmal von UTF-8 nach ISO-8859-1 konvertieren, um aus dem doppelt kodierten UTF-8 ein einfaches zu machen, und die konvertierte Datei unter Angabe der Kodierung UTF-8 wieder zu importieren.

    Auf alle Fälle solltest du dir eine Sicherheitskopie der jetzigen Daten erstellen, nicht dass noch mehr kaputt geht. Wenn du Zugriff auf den Datenbankserver hast kannst du dir dabei aus dem MySQL-Daten-Verzeichnis die Dateien der Tabellen an einen anderen Ort kopieren. Wenn nicht, kopiere die Tabelle mit der von phpMyAdmin angebotenen Operation in eine zweite.

    echo "$verabschiedung $name";

    1. Hallo,

      Ich gehe eher davon aus, dass das Problem auf einer nicht korrekt ausgehandelten Kodierung beruht, die für die Verbindung zwischen MySQL und deinen Anwendungen verwendet werden soll. Vermutlich steht diese auf Latin1/ISO-8859-1. Das hat zur Folge, dass du UTF-8-Daten sendest, MySQL annimmt, ISO-8859-1 zu bekommen, das nach UTF-8 umwandelt, um es in den Tabellenfeldern zu speichern. Bei der Ausgabe wandelt es das wieder nach ISO-8859-1 um, und du stellst es als UTF-8 dar.

      Ja. Genau das war es. Tausend dank.

      Wenn meine Annahme stimmt, müsstest du zum einen deiner Anwendung beibringen, SET NAMES utf8 direkt nach einem Verbindungsaufbau zu senden und zum anderen deine fehlerhaften Daten in den Tabellen korrigieren. Du könntest dazu deine Daten auf die bisher falsche Art auslesen, und sie diesmal mit SET NAMES utf8 wieder einlesen. Alternativ kannst du die Daten unter Verwendung von phpMyAdmin in eine Datei exportieren, diese Datei mit einem extern Programm einmal von UTF-8 nach ISO-8859-1 konvertieren, um aus dem doppelt kodierten UTF-8 ein einfaches zu machen, und die konvertierte Datei unter Angabe der Kodierung UTF-8 wieder zu importieren.

      Habe SET NAMES utf8 hinzugefügt und schon ging es. Glücklicherweise hatte ich kein Problem damit bestehende Datensätze konvertieren zu müssen, da ich noch in der "Testphase" stecke.

      Vielen Dank nochmal und viele Grüße

      Michael