Laire: Problem: Formular -> Sonderzeichen in MySQL abspeichern

Hallo,

ich habe auf meiner Seite, welche utf-8 codiert ist ein Formular, welchem ich auch ein Zeichensatzt zugeweisen habe:

<form action="newskom.php" method="post" accept-charset="utf-8">

Der Inhalt dieses Formulars soll dann in einer Tabelle meiner MySQL Datenbank gespiechert werden. Dort werden dann die umlaute wie ö ä ü aber als Sonderzeichen z.B. ä abgelegt.

Wo steckt wahrscheinlich der Fehler, bzw. wie löse ich das Problem?

  1. Hallo,

    ich habe auf meiner Seite, welche utf-8 codiert ist ein Formular, welchem ich auch ein Zeichensatzt zugeweisen habe:

    <form action="newskom.php" method="post" accept-charset="utf-8">

    Der Inhalt dieses Formulars soll dann in einer Tabelle meiner MySQL Datenbank gespiechert werden. Dort werden dann die umlaute wie ö ä ü aber als Sonderzeichen z.B. ä abgelegt.

    Wo steckt wahrscheinlich der Fehler, bzw. wie löse ich das Problem?

    In utf-8 belegen viele Zeichen mehr als ein Byte. Zeigst Du eine utf-8-kodierte Zeichenkette mit einem fest an einem Byte pro Zeichen orientierten Zeichensatz (wie zum Beispiel dem üblichen iso-8859-1) statt mit utf-8 an, erhältst Du statt des einen gewünschten Zeichens logischerweise zwei falsche Zeichen als Ausgabe.

    Dein Fehler ist also, dass du nicht mit utf-8 ausgibst, sondern mit iso-8859-1 (oder einem ählichen Zeichensatz). Merke: Wo man Zeichensatz X reinpackt, muss man auch Zeichensatz X wieder rausholen.

    Wie du das Problem behebst, hängt davon ab, wo und wie du die Zeichen ausgibst. In einer HTML-Seite würde <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> helfen, am Besten als erstes im <head>-Block.

    Gruß, Lars

    1. Die html seite und auch das Eingabefeld sind utf8 formatiert. Das Problem besteht in der Datenbank, dort wird es falsch abgespeichert.

      1. Die html seite und auch das Eingabefeld sind utf8 formatiert. Das Problem besteht in der Datenbank, dort wird es falsch abgespeichert.

        Dann lasse die speichernde Applikation mit der Datenbank auch UTF-8 sprechen:
        http://forum.de.selfhtml.org/archiv/2006/1/t121385/#m780313

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. Die html seite und auch das Eingabefeld sind utf8 formatiert. Das Problem besteht in der Datenbank, dort wird es falsch abgespeichert.

          Dann lasse die speichernde Applikation mit der Datenbank auch UTF-8 sprechen:
          http://forum.de.selfhtml.org/archiv/2006/1/t121385/#m780313

          Siechfred

          Hm irgendwie will er aber immer noch nicht...

          Also meine Seiten sind utf-8 formatiert:

          <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

          Das Formular auch:

          <form action="newskom.php method="post" accept-charset="utf-8">

          Und vor dem Einfügen in die Datenbank habe ich den Befehl aus dem Link, den du gepostet hast gesetzt:

          $query = "SET NAMES utf8";
          $result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
          $sql = "INSERT INTO test
          (message)
          VALUES
          ('$formkom')
          ";
          $insert = mysql_query($sql);

          Trotzdem werden die Unmlaute in der Datenbank als komische Zeichen gespeichert.

          Die Felder der Datenbank wo die Speicherung erfolgt ahben die Kollation utf8_bin

          1. hi,

            Trotzdem werden die Unmlaute in der Datenbank als komische Zeichen gespeichert.

            Woran machst du diese Erkenntnis fest?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. hi,

              Trotzdem werden die Unmlaute in der Datenbank als komische Zeichen gespeichert.

              Woran machst du diese Erkenntnis fest?

              gruß,
              wahsaga

              Wenn ich per phpmyadmin in meine Datenbank schaue, bekomme ich Zeichen wie: ä angezeigt.

              1. hi,

                Trotzdem werden die Unmlaute in der Datenbank als komische Zeichen gespeichert.

                Woran machst du diese Erkenntnis fest?

                Wenn ich per phpmyadmin in meine Datenbank schaue, bekomme ich Zeichen wie: ä angezeigt.

                Und hast du deinem PMA denn auch gesagt, dass er bitte "in UTF-8" mit der Datenbank kommunizieren solle?

                (Einstellung findet sich auf der Startseite.)

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. Und hast du deinem PMA denn auch gesagt, dass er bitte "in UTF-8" mit der Datenbank kommunizieren solle?

                  (Einstellung findet sich auf der Startseite.)

                  gruß,
                  wahsaga

                  Einstellung auf der Startseite:
                  MySQL-Zeichensatz: UTF-8 Unicode (utf8)
                  Zeichensatz / Kollation der MySQL-Verbindung: utf8_general_ci

                  1. hi,

                    Einstellung auf der Startseite:
                    MySQL-Zeichensatz: UTF-8 Unicode (utf8)
                    Zeichensatz / Kollation der MySQL-Verbindung: utf8_general_ci

                    Gut, jetzt sprechen also dein eintragendes Script und dein PMA bei der Ausgabe UTF-8 mit der Datenbank.

                    Du hast dir aber schon Einträge angeschaut, die du _nach_ der Umstellung deines Scriptes eingefügt hast, oder?

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. Gut, jetzt sprechen also dein eintragendes Script und dein PMA bei der Ausgabe UTF-8 mit der Datenbank.

                      Du hast dir aber schon Einträge angeschaut, die du _nach_ der Umstellung deines Scriptes eingefügt hast, oder?

                      Ja habe ich... immer noch ä war auch schon vorher alles so eingestellt

                      1. Ja habe ich... immer noch ä war auch schon vorher alles so eingestellt

                        Mal anders gefragt: Was kümmert dich die Ausgabe von phpmyadmin? Du benutzt die Daten doch sicherlich in irgendwelchen echten, also öffentlichen Webseiten. Was passiert denn dort?

                        Gruß, Lars

                        1. echo $begrüßung;

                          Mal anders gefragt: Was kümmert dich die Ausgabe von phpmyadmin? Du benutzt die Daten doch sicherlich in irgendwelchen echten, also öffentlichen Webseiten. Was passiert denn dort?

                          Der phpMyAdmin macht in der Regel keine Fehler. Wenn er doch etwas falsch anzeigt, dann sind die Daten bereits an anderer Stelle verunstaltet worden. Meist ist es dann so gewesen, dass man dem MySQL beim Datenübergeben selbige in der falschen Kodierung übergeben hat. Das passiert, wenn MySQL eine andere Default-Einstellung hat, als man selbst für seine Daten verwendet und bei der Übergabe nicht explizit die verwendete Kodierung mitteilt.

                          echo "$verabschiedung $name";

                      2. echo $begrüßung;

                        Gut, jetzt sprechen also dein eintragendes Script und dein PMA bei der Ausgabe UTF-8 mit der Datenbank.
                        Du hast dir aber schon Einträge angeschaut, die du _nach_ der Umstellung deines Scriptes eingefügt hast, oder?
                        Ja habe ich... immer noch ä war auch schon vorher alles so eingestellt

                        Dass der phpMyAdmin vorher schon so eingestellt war, glaube ich dir gern. Aber es ging nicht um die Einstellung des PMA sondern um die Einstellung des Scripts, das die Daten dem MySQL-Server übergeben hat. Wenn das vorher bereits seine Verhandlungen mit MySQL mit SET NAMES utf8 eingeleitet hat, dann sehe ich keinen Grund für den Fehler.

                        Ein Empfänger, der ISO-8859-1 erwartet, sattdessen aber UTF-8-Daten erhält, behandelt die einzelnen Bytes der UTF-8-Zeichen als einzelne Zeichen. Ein UTF-8-kodiertes ä besteht aus ISO-8859-1-Sicht eben aus den Zeichen à und ¤.

                        Der Grund, dass MySQL trotz der anderslautenden Einstellung der Felder immer noch von ISO-8859-1 bzw. Latin1 ausgeht, ist, dass die Default-Einstellung der Kodierung für Client-Verbindungen in deinem System auf ISO-8859-1/Latin1 steht. Wenn MySQL nun Zeichen über eine Client-Verbindung entgegennimmt, interpretiert es diese gemäß dieser Kodierung, und nimmt beim Eintragen in die Felder gegebenenfalls eine Umwandlung in die dort eingestellte Kodierung vor.

                        Zur Behebung des Problem ist es am einfachsten, wenn man die betroffenen Tabellen leert, bzw. die fehlerhaften Datensätze löscht, und dann den Importvorgang noch einmal mit Angabe der richtigen Kodierung wiederholt.
                        Wenn die Daten nicht mehr außerhalb der Datenbank zur Verfügung stehen, und es zu viele sind, sie mit dem PMA händisch zu korrigieren, müsstest du dich nochmal melden, dann überleg ich mir ein passendes Statement zum Korrigieren der Kodierung.

                        echo "$verabschiedung $name";