Taobyby: Umlaute

Hi!
Ich habe ein komisches Problem und weißt nicht wie ich es lösen kann.
Ich bin gerade dabei eine Seite zu coden auf der ich einfach Daten in eine Datenbank reinschreibe. Zuerst wurden die Umlaute zwar in der Datenbank gespeichert aber beim Ausgeben wurden sie in nen Platzhalter-Zeichen umgewandelt dann habe ich direkt nach dem Verbindungsaufbau
nen Querry gesetzt $res=mysql_query("SET NAMES 'utf8'");
und es ging dann habe ich zum testen datensätze gespeichert und auf einer anderen Seite ausgegeben das ging auch doch als ich zum 9. Datensatz kam wollte ich testweise probieren in DEZIMAL Feldern statt dem . ein Komma zu setzen nachdem ich das gemacht hatte wurden die Umlaute der anderen(TEXT)Feldern nur noch als Fragezeichen in die Datenbank gespeichert. Ich habe davor nichts am Charset verändert oder sonstwas gemacht.
Hoffe ihr könnt mir helfen ich finde keinen Grund dafür.

mfg Jan

  1. echo $begrüßung;

    [...] dann habe ich direkt nach dem Verbindungsaufbau nen Querry gesetzt $res=mysql_query("SET NAMES 'utf8'"); und es ging

    Mit anderen Worten: Du sendest jetzt UTF-8-kodierte Daten und deklarierst das auch so, so dass das DBMS sie auch als solche interpretieren kann.

    Und wie sind die String-Felder (Felder! Jedes einzeln. Tabellen- und Datenbankeinstellungen sind irrelevant) eingestellt? Haben die eine Kollationsangabe mit utf8 drin, so dass das MySQL die Daten auch ohne Verlust speichern kann? Anderenfalls fände eine Umkodierung in die für das jeweilige Feld konfigurierte Kodierung statt, die unter Umständen verlustbehaftet sein kann.

    Nebenbei: Besser[1] als ein SET NAMES-Query wäre die Verwendung der Funktion mysql_set_charset(), wenn sie bei in deiner PHP-Version vorhanden ist.

    [1] Vom Prinzip her richtiger, aber ohne Auswirkungen auf ISO-8859-x und UTF-8.

    dann habe ich zum testen datensätze gespeichert und auf einer anderen Seite ausgegeben das ging auch doch als ich zum 9. Datensatz kam wollte ich testweise probieren in DEZIMAL Feldern statt dem . ein Komma zu setzen

    Ein Komma geht gar nicht. Weder für den 9. noch für andere Datensätze. Das Dezimaltrennzeichen ist immer der Punkt. Ein Komma steht für die Trennung zwischen zwei Werten. Die Kodierung wird davon aber nicht beinflusst.

    nachdem ich das gemacht hatte wurden die Umlaute der anderen(TEXT)Feldern nur noch als Fragezeichen in die Datenbank gespeichert.

    Das DBMS ist eine Blackbox. Du kannst da nicht so einfach reinschauen. Du musst Daten stets abfragen. Dazu brauchst du eine Verbindung, auf der eine passende Kodierung ausgehandelt sein muss. Sonst gibt es Datenverlust, wenn MySQL die Daten aus der Feldkodierung in die Verbindungskodierung umkodiert. Weiterhin muss auch das Anzeigemedium über die Zeichenkodierung informiert werden.

    Wenn du zum Kontrollieren den phpMyAdmin genommen hast, dann kannst du davon ausgehen, dass der alles richtig macht. Wenn der was Unerwünschtes anzeigt, dann sind die Daten in der Tabelle fehlerhaft.

    Ich habe davor nichts am Charset verändert oder sonstwas gemacht. Hoffe ihr könnt mir helfen ich finde keinen Grund dafür.

    Der Grund für die Fragezeichen kann eine Umkodierung sein, bei der in der Zielkodierung ein Zeichen nicht darstellbar ist, oder dass UTF-8 erwartet war und keine gültige UTF-8-Sequenz geschickt wurde. Das ? kann also bei Umkodierungen oder bei einer Datenübergabe ohne passend ausgehandelte Kodierung entstehen.

    Helfen kann ich dir nur mit allgemeinen Hinweisen. Es sei denn, du kannst das Problem nachvollziehbar mit dem kleinstmöglichen Versuchsaufbau schildern oder darstellen, so dass man eventuell deinen Fehler erkennen kann.

    Ansonsten kannst du nur peinlich genau darauf achten, dir bei jeglicher Datenverarbeitung diese Fragen zu stellen: Wo findet eine Datenübergabe statt? Ist der Empfänger über die verwendete Kodierung informiert? Sind die Daten dementsprechend kodiert? Kann ein verarbeitendes System mit der Kodierung umgehen? Nimmt es zum Zwecke der Verarbeitung oder Speicherung Umkodierungen vor? Sind dafür passende Kodierungen konfiguriert?

    echo "$verabschiedung $name";

  2. Ich habe das Problem jetzt gelöst indem ich die Datenbank neu aufgesetzt habe und alles auf utf8_bin eingestellt habe dann habe ich auf jede seite noch einen meta tag mit utf8 eingefügt und das re$=... beibelassen solange es geht werde ich erstmal nichts dran ändern falls doch was passiert mache ich noch mysql_set_charset= dazu. Danke erstmal für die Hilfe.

    Vorher war die Datenbank auf Latin1_swedish eingestellt die tabelle auf latin1_german_cs und die einzelnen Felder auf utf8 da ist klar das unterwegs was schief gehen muß.

    1. echo $begrüßung;

      Vorher war die Datenbank auf Latin1_swedish eingestellt die tabelle auf latin1_german_cs und die einzelnen Felder auf utf8 da ist klar das unterwegs was schief gehen muß.

      Nein, das ist nicht die Ursache. Die Datenbankeinstellung ist ein Defaultwert für neu erstellte Tabellen, wenn dabei keine Kodierungs-/Kollationsangabe gemacht wurde. Der Tabellenkonfigurationswert wiederum ist ein Default-Wert für neu erstellte Felder, wenn bei deren Anlegen keine Kodierungsangabe gemacht wurde. Wenn das Feld einmal existiert, ist allein dessen konfigurierter Wert ausschlaggebend.

      [...] solange es geht werde ich erstmal nichts dran ändern falls doch was passiert mache ich noch mysql_set_charset= dazu.

      Wichtig für die Kommunikation mit den einzelnen Clients ist die Kodierung, die individuell auf jeder Verbindung ausgehandelt werden kann. Wird das nicht gemacht, und die Default-Einstellung steht beispielsweise auf Latin1, dann nimmt das DBMS an, dass es Latin1-Daten bekommt. Schickst du nun UTF-8, so sieht erstmal alles problemlos aus, aber in den Feldern landen nun doppelt UTF-8-kodierte Daten. MySQL geht davon aus, dass es Latin1-kodierte Daten bekommt. Es betrachtet die Bytes der UTF-8-Sequenzen als einzelne Latin1-Zeichen und kodiert diese nach UTF-8 um, um sie in den Feldern abzulegen. Rückwärts kodiert es die doppelt UTF-8-kodierten Daten wieder nach Latin1 zurück, du interpretierst sie als UTF-8 und denkst, dass alles i.O. ist. Probleme bekommst du erst dann, wenn du Hilfsmittel wie phpMyAdmin verwenden willst oder Stringfunktionen des DBMS wie Sortierung und Zeichenzählung anwenden willst.

      Es ist also neben der Feldkodierungskonfiguration wichtig, die Verbindungskodierung einzustellen.

      echo "$verabschiedung $name";