Nina: PHP+Mysql - UTF8 => Umlaute?!

Hallo,

habe ein php Script gebastelt, das zusammen mit einer Mysql-DB arbeitet, d.h. eines der Scripte holt Daten aus der DB, und eine kann etwas reinschreiben.
Nun ist es so, dass ich für alle Scripte im Header utf8 anordne:
header('content-type: text/html; charset=utf-8');
und für die Mysql-Verbindung wird anfangs gleich das ausgeführt:
mysql_query("SET NAMES utf8");

Wenn ich jezt mit phpmyadmin die DB betrachte, sehe ich, dass die Umlaute korrekt drinstehen.

Rufe ich jedoch das Script zur Ausgabe von Daten der DB aus, so werden statt Umlaute Fragezeichen angezeigt, obwohl auch dort alles mit utf8 ausgestattet ist.

Was habe ich vergessen oder was ist da los?
Danke

  1. Ich vermute deine Datenbank liefert das UTF-8 nicht korrekt aus. In welchem Zeichensatz stellt den phpMyAdmin deine Inhalte dar? Sicher in utf-8?
    Auf den ersten Blick sieht für mich jedenfalls alles richtig aus...

    Probiere als Querry auch mal: "SET CHARACTER SET utf8" bzw. setze dein utf8 in anführungsstriche. ("SET NAMES 'utf8'")

    1. In welchem Zeichensatz stellt den phpMyAdmin deine Inhalte dar? Sicher in utf-8?

      Die Kodierung der phpmyadmin Seite ist UTF-8

      Probiere als Querry auch mal: "SET CHARACTER SET utf8" bzw. setze dein utf8 in anführungsstriche. ("SET NAMES 'utf8'")

      habe das nun auch probiert. ändert nichts :/ leider bleiben die ? etc...

      1. Hello,

        hast Du Dir denn mal mit einem Hex-Editor angeschaut, was tatsächlich an Daten geliefert wird?
        Und dann lass Dir mal das Create-Statement der betroffenen Tabellen zeigen.

        show create table <tabellenname>;

        Das könnte vielleicht einen Hinweis geben auf die Ursache.

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. echo $begrüßung;

          Und dann lass Dir mal das Create-Statement der betroffenen Tabellen zeigen.
             show create table <tabellenname>;
          Das könnte vielleicht einen Hinweis geben auf die Ursache.

          Im Prinzip nicht. Du vermutest wahrscheinlich, dass für die Felder die Kodierung auf Latin1 steht. Das macht nichts, denn wenn du für die Verbindung eine andere Kodierung festlegst, wandelt MySQL die Kodierung der Felddaten in die Kodierung der Verbindung um. Das ist natürlich prinzipbedingt nicht von jeder Kodierung in jede andere möglich, aber von Latin1 nach UTF-8 darf es keine Probleme geben.

          echo "$verabschiedung $name";

          1. Hello,

            Im Prinzip nicht. Du vermutest wahrscheinlich, dass für die Felder die Kodierung auf Latin1 steht. Das macht nichts, denn wenn du für die Verbindung eine andere Kodierung festlegst, wandelt MySQL die Kodierung der Felddaten in die Kodierung der Verbindung um. Das ist natürlich prinzipbedingt nicht von jeder Kodierung in jede andere möglich, aber von Latin1 nach UTF-8 darf es keine Probleme geben.

            Es wäre eigentlich unerheblich, ob die Daten in Latin 1 oder in utf-8 gespeichert werden, wenn nur sichergestellt ist, dass sie beim Holen genauso behandelt werden, wie beim Wegschreiben.

            Ich vermutete den Fehler eher bei der Erfassung bzw. in der Darstellungsschicht für den User.

            Es muss auf jedem Wegstück des Datentransportes und in jeder "Behandlungsroutine" sichergestellt sein, dass die gerade vorliegende Codierung bekannt ist und berücksichtigt wird.

            Seit wann können die Browser eigentlich UTF-8 ?

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. echo $begrüßung;

              Es wäre eigentlich unerheblich, ob die Daten in Latin 1 oder in utf-8 gespeichert werden, wenn nur sichergestellt ist, dass sie beim Holen genauso behandelt werden, wie beim Wegschreiben.

              Das muss nicht sichergestellt werden, da MySQL gegebenenfalls eine Umwandlung vornimmt. Sichergestellt werden muss nur, dass Client und Server in der aktuellen Verbindung die gleiche Kodierung verwenden. Es ist beispielsweise problemlos möglich, in Richtung MySQL Latin1 zu verwenden und beim Abfragen UTF-8. Und die Kodierung der Felder ist dabei ebenfalls nebensächlich. (Man muss eigentlich nur darauf achten, dass in der gesamten Verarbeitungskette keine Kodierung verwendet wird, die nicht alle gewünschten Zeichen darstellen kann. Dieses Beachten kann man sich sparen, wenn man konsequent auf UTF-8 setzt.)

              Ich vermutete den Fehler eher bei der Erfassung bzw. in der Darstellungsschicht für den User.

              Wenn der Fehler in Richtung MySQL entsteht, müsste der PMA auch Fehler anzeigen. Auf dem Weg MySQL->PMA habe ich bisher noch keine Fehler feststellen können.

              Es muss auf jedem Wegstück des Datentransportes und in jeder "Behandlungsroutine" sichergestellt sein, dass die gerade vorliegende Codierung bekannt ist und berücksichtigt wird.

              Ja, diese müssen aber nur für das aktuelle Wegstück berücksichtigt werden, wenn die beteiligten Partner zwischen den Wegstücken für eine korrekte, verlustfreie Umwandlung sorgen (können).

              Seit wann können die Browser eigentlich UTF-8 ?

              Eigentlich schon seit geraumer Zeit. Was wirklich beim Client ankommt kann man übrigens erraten, wenn man im Menü Ansicht die (Zeichen)Kodierung mal händisch umstellt. Kommt es beim Umstellen auf Latin1/ISO-8859-1 zu einer richtigen Anzeige der Zeichen kann man davon ausgehen, dass der Browser ISO-8859-1-kodierte Daten empfangen hat. Die Fragezeichen deuten darauf hin, dass keine UTF-8-Kodierung, wie angegeben, verwendet wurde.

              echo "$verabschiedung $name";

    2. Probiere als Querry auch mal: "SET CHARACTER SET utf8" bzw. setze dein utf8 in anführungsstriche. ("SET NAMES 'utf8'")

      Was ich jedoch nicht verstehe:
      wähle ich im Mozilla manuell als Kodierung "iso8859-1" aus, so erscheinen diese Umlaute korrekt. Aber das Hinzufügen Script nutzt doch auch UTF8...

    3. echo $begrüßung;

      Ich vermute deine Datenbank liefert das UTF-8 nicht korrekt aus. In welchem Zeichensatz stellt den phpMyAdmin deine Inhalte dar? Sicher in utf-8?

      Was sich der phpMyAdmin selbst einstellt hat keine Auswirkungen auf andere Scripte. Es ist nur interessant, was der PMA über die Default-Einstellungen MySQLs erzählt, siehe Seite MySQL-System-Variablen und dort, wenn zwei Zeilen pro Wert vorhanden sind, die Zeile "Globaler Wert".

      Auf den ersten Blick sieht für mich jedenfalls alles richtig aus...

      Auch ich kann aus der Beschreibung keinen Fehler entnehmen.

      Probiere als Querry auch mal: "SET CHARACTER SET utf8" bzw. setze dein utf8 in anführungsstriche. ("SET NAMES 'utf8'")

      SET CHARACTER SET sollte man zugunsten von SET NAMES nicht verwenden, wenn man nicht den Unterschied zwischen beiden Statements verstanden hat, und diesen explizit haben will. Denn mit SET CHARACTER SET kann es bei ungünstiger Konfiguration des Wertes character_set_database zu Datenverlust in Richtung MySQL kommen.
      Für die Richtung zum Client spielt der Unterschied keine Rolle, auch werden die Anführungszeichen um das utf8 nicht benötigt.

      Als nächsten Schritt schlage ich vor, die aktuellen Kodierungsparameter ausgeben zu lassen

      SHOW VARIABLES LIKE "char%"

      Dies sollte natürlich in dem Script erfolgen, das fehlerhaft arbeitet, _nicht_ im phpMyAdmin. Außerdem sollte diese Ausgabe an der Stelle eingefügt werden, an der derzeit die Daten fehlerhaft abgefragt werden.

      echo "$verabschiedung $name";