rainer: mysql zeichnsatz konvertieren

Hallo,

in meiner Datenbank liegen Daten in latin1 vor. Diese möchte ich nach utf8 konvertiert abfragen.
Dabei soll der Datenbestand nicht neu gespeichert werden, sondern nur eine Konvertierung bei der Abfrage erfolgen.

field = "müller"

Dabei liefert

SELECT CONVERT(field USING utf8), field

bzw. um es noch mehr zu verdeutlichen

SELECT CONVERT(field USING utf8), CONVERT(field USING latin1)

zwei identische Felder. Und wenn ich es dann auf eine utf8 codierte html Seite ausgebe erscheint m?ller, was also darauf hindeutet, das nichts konvertiert wurde, sondern latin1 geblieben ist.

Woran könnte das liegen und wie kann man das beheben?

Danke!

  1. echo $begrüßung;

    Dabei liefert
    SELECT CONVERT(field USING utf8), field
    bzw. um es noch mehr zu verdeutlichen
    SELECT CONVERT(field USING utf8), CONVERT(field USING latin1)
    zwei identische Felder. Und wenn ich es dann auf eine utf8 codierte html Seite ausgebe erscheint m?ller, was also darauf hindeutet, das nichts konvertiert wurde, sondern latin1 geblieben ist.

    Das ist eine falsche Schlussfolgerung. Die Konvertierung hat sehr wohl stattgefunden, wirkte jedoch erst einmal nur intern. Diese händische Kodierung ist eigentlich nur dann sinnvoll, wenn man Felder/Werte mit unterschiedlicher Kodierung gemeinsam verarbeiten möchte.

    Woran könnte das liegen und wie kann man das beheben?

    Wenn Daten zum Client ausgegeben werden, dann wird die berechnete Ergebnismenge gemäß character_set_results kodiert und dann erst übertragen. Stelle für die Clientverbindung eine von dir gewünschte Kodierung ein (Stichwort: SET NAMES), dann bekommst du die Daten in dieser geliefert. Es ist dabei egal, in welcher Kodierung die Daten in den Datenbanken/Tabellen/Feldern abgelegt sind, die Kodierung wird automatisch vorgenommen. Voraussetzung, dass es dabei nicht zu Fehlern kommt, ist eine richtige Einstellung der Kodierungsangabe der (String-)Felder (und dass die Daten nicht bereits durch andere Unachtsamkeiten unbrauchbar geworden sind.)

    dringende Literaturempfehlung: Kapitel Character Set Support im MySQL-Handbuch der Version 4.1 und höher.

    echo "$verabschiedung $name";

    1. das erklärt es.

      und phpMyAdmin stellt seine Verbindung und Client Results usw. standardmäßig automatisch auf utf8 ein.
      Wenn man also in phpMyAdmin die Einstellungen abfragt

      SHOW VARIABLES LIKE 'character_set%';

      ist schon (fast) alles utf8.

      Deswegen dachte ich auch erst, ist doch alles ok.
      Die selbe Abfrage über die MySql Konsole zeigt nun latin1 an, und das ist dann auch das was die eignenen Programme bekommen.

      Also einfach nach Verbindungsaufbau

      SET character_set_results = utf8;

      und die Sache läuft Wunschgemäß. Das ganze CONVERT ( USING ) ist dann auch überflüssig.

      Vielen Dank!

      1. echo $begrüßung;

        Also einfach nach Verbindungsaufbau
        SET character_set_results = utf8;
        und die Sache läuft Wunschgemäß.

        Nur, wenn du nur Daten abfragst. Beim Senden gilt character_set_client und character_set_connection. Am einfachsten ist es wohl alle drei gleichzeitig mit dem dafür vorgesehenen SET NAMES zu setzen.

        echo "$verabschiedung $name";