Bin Dabei meine Webseite/Mysql auf UTF-8 umzustellen und brauche hilfe bei einem Prob

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Bin Dabei meine Webseite/Mysql auf UTF-8 umzustellen und brauche hilfe bei einem Prob

    Hallo, ich bin neu hier und möchte mich gleich mit einem großen Problem an euch wenden, ich hoffe das macht keinen schlechten Eindruck

    Ich habe vor kurzem beschlossen meine Webseite von ISO-8859-1 Zeichenkodierung auf UTF-8 umzustellen, und ebenso auch meine Mysql Datenbank aus der die Webseite einige Inhalte dynamisch erstellt (die Datenbank besteht aus ein paar Tabellen mit der Kollation Latin1_general_ci und diese Daten habe ich allesamt über Eingabeformulare auf meiner Webseite gefüllt d.h. sie kamen schon von der Webseite im ISO-8859-1 Format). Dabei bin ich nun auf ein paar Probleme gestoßen die ich mit meinem mangelnden Wissen nicht mal lokalisieren kann, ich habe aber ein Datenbankbackup und habe daher ein bisschen herrumexperimentiert. Aber nun erstmal zu meinem konkreten Problem:

    Mein erster Schritt in der Umstellung der Webseite war: die einzelnen Webseiten als UTF-8 abzuspeichern (ohne BOM, wegen SESSION/Header Problemen). Desweiteren habe ich auch in den Meta-Tags den neuen charset eingestellt damit die Seite auch richtig angezeigt wird (und der Browser erkennt auch UTF-8 als Charset bzw. benutzt es). Zuerst ist mir dann natürlich aufgefallen das die Webseite an den Stellen an welchen Textinhalte aus der Mysql-Datenbank angezeigt wurden teilweise Fehler aufwies, also im speziellen wurden deutsche Umlaute durch einfache "?" ersetzt (jedes Zeichen das nicht dargestellt werden konnte wurde durch so ein Fragezeichen ersetzt) auch im Quellcode, eine testweise, temporäre, manuelle Umstellung der Zeichenkonvertierung im Browser (ich benutzte FireFox, da geht das über "Ansicht") auf ISO-8859-1 sorgte wieder für eine korrekte Darstellung dieser "?". Ich vermutete das diese fehlerhafte Darstellung darauf zurückzuführen ist das die Datenbank die Inhalte nicht um UTF-8 Format enthält also dachte ich mir das es wohl das Sinnvollste wäre die Datenbank bzw. die Inhalte zu konvertieren, aber bevor ich dies versuchte habe, habe ich zum Testen nocheinmal versucht einen dieser Textinhalte aus der Datenbank über eben so ein Formular über welches ich es ursprünglich in die Datenbank gebracht habe, zu editieren, ich habe also den Text bearbeitet und siehe da, scheinbar wurde dieser bearbeitete String dann im UTF-8 Format abgespeichert (vermutlich weil die Seite ja jetzt eine UTF-8 Datei war). Alle anderen Strings konnten zwar noch immer nicht vernüpftig dargestellt werden aber dieser Eine war ok, nur dachte ich mir das es wenig bringt jetzt jeden Inhalt auf diese Weise zu konvertieren da es ewig dauern würde (außerdem habe die Tabellen ja noch die Kollation Latin1_general_ci und ich will ja utf8_unicode_ci, ich verstehe zwar nicht wieso es auch so klappt aber ich will lieber sicher gehen).
    Deshalb habe ich eine der Datenbank-Tabellen mit phpMyAdmin exportiert (in eine Reihe SQL Anweisungen: ein Table Create und diverse Inserts) habe dann diese eine Tabelle gelöscht und neu angelegt und zwar diesmal so das ich alle Kollationen auf utf8_unicode_ci gestellt habe, dann habe ich mir die exportieren Inserts vorgenommen und in einer UTF-8 Datei gespeichert (um sie zu konvertieren). Diese Datei habe ich dann über die Importfunktion von phpMyAdmin benutzt um die Tabelle wieder zu füllen (habe auch angegeben das die Datei UTF-8 ist). So nun müsste diese Tabelle doch eigentlich UTF-8 enthalten oder nicht?
    Jedenfalls brachte dies Überhaupt nichts, die Inhalte wurden trotzdem genauso "?"-behaftet angezeigt wie vorher.

    So dieses Problem hat erstmal dafür gesorgt das ich mich 2 Tage lange Abends in den Schlaf geweint habe, bis ich vor kurzem von diesem Mysql Befehl erfahren habe: SET NAMES 'utf-8'
    wenn man dieses vor der Kommunikation mit der Datenbank aufruft dann sollte die gesammte Kommunikation in UTF-8 ablaufen, also die Datenbank erwartet vom Client UTF-8 und sendet selbst auch so. Und dies brachte in der Tat einen ersten Erfolg (ich brachte so einen Query nämlich im Konstruktor meiner Mysql Klasse unter) nämlich wurden auf einmal sämtliche Datenbankinhalte auf der UTF-8 Webseite völlig Fehlerfrei angezeigt, sowohl die ganzen alten Tabellen als auch diese eine neue die ich schon wie oben beschrieben ins UTF-8 konvertiert hatte (obwohl ich mir nicht sicher bin ob meine Methode überhaupt für eine Konvertierung gesorgt hat, ich weiß ja nicht wie ich das Nachprüfen kann). Nur einen großen Haken hatte die Sache: sämtliche neuen oder bearbeiteten Inhalte (über die Formulare auf der Webseite) werden nun nicht vernüpftig in der Datenbank gespeichert (egal ob sie in der neuen konvertieren Tabelle oder in den alten abgelegt werden), die deutschen Umlaute werden, in der Tabelle gespeichert und zwar so das die Umlaute und einige Sonderzeichen durch ein bis zu 3 Zeichen langes cryptisches Etwas ersetzt werden, sowohl in phpMyAdmin als auch auf der Webseite, wenn die Daten wieder ausgelesen werden, sieht es zumindest gleich cryptisch aus. Nur ist es diesmal so, das ein Manuelles wechseln der Zeichenkodierung im Browser alles nur schlimmer machte, also keine andere Kodierung sorgte auch nur für eine bessere Darstellung.

    Wie man sieht hat SET NAMES 'utf-8' das Problem jetzt umgekehrt: vorher wurden die alten Daten falsch angezeigt, egal ob konvertiert oder nicht, dafür aber die neuen korrekt und jetzt werden die alten Daten, egal ob konvertiert oder nicht, korrekt angezeigt, aber die neuen werden noch kryptischer.

    So das ist mein Problem, ich hoffe das ich hier einen Profi finde der mir sagen kann wo das Problem liegen könnte, und mir nebenbei vieleicht noch sagt ob mein beschriebener Umkodierungsversucht den ich oben für eine Tabelle testweise durchgeführt habe, korrekt war oder ob er nichts geändert hat.
    Wenn mir jemand helfen kann, dann wäre ich unendlich glücklich da meine Webseite nun schon einige Zeit lang offline ist und ich kurz vor dem Nervenzusammenbruch stehe.

  • #2
    Keine Ahnung, das klingt als würdest du den Zeichensatz irgendwo schrotten...

    Wenn der Browser die Website als UTF8 anzeigt und "set names" mit utf8 beim Verbinden mit der DB aufgerufen wird, ist alles okay.
    Alles weitere machst du ggf. selbst kaputt, da hilft dann nur Eingrenzen des Problems.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hmm, also mit SET NAMES werden ja die alten Datenbestände korrekt angezeigt, obwohl korrekt vielleicht das falsche Wort ist, denn die alten Daten wurden ja nicht als UTF-8 abgelegt, oder bewirkt SETNAMES auch das die Datenbank die Daten vorher umkodiert damit ja in jedemfall UTF-8 sind?
      Das Problem ist ja das mit SET NAMES die Neuen Daten nicht mehr vernüpftig gespeichert werden, das kann ja meinem Verständnis nach nur daran liegen das sie entweder vom Browser nicht als UTF-8 gesendet werden, oder nicht so gespeichert werden (denn phpMyAdmin zeigt sie genau so kryptisch an) ich habe sogar mal in den Formularen das accept-charset auf UTF-8 gestellt zur sicherheit, hat aber nichts geändert.
      Was mich nur wundert ist das die Datenbank die Daten nicht als UTF-8 abesendet wenn SET NAMES nicht benutzt wird, auch bei der Manuell umkonvertieren Tabelle nicht, wohl aber bei den Neuhinzugefügen Daten. Das ist alles sehr verwirrend. Wie kann ich denn das Problem näher eingrenzen?
      Wie gesagt habe ich ein Backup der Datenbank und bin bereit jeden noch zu absurden Vorschlag mal irgenteine belibige Änderung vorzunehmen auszuführen, hauptsache ich bekomme das Problem irgentwann gelöst.

      Kommentar


      • #4
        1. Verabschiede dich von der Idee, dass Kollation irgendwas mit Zeichensatz zutun hat - Pustekuchen. Kollation = Sortierung = vollkommen irrelevant
        2. Der MySQL-Server speichert die Daten von vornherein als UTF8, seit Version 4.2.* glaube ich.
        3. Nur der Zeichensatz der Verbindung bestimmt in welchem Zeichensatz die Daten zurückgeliefert werden.
        Der Standard ist latin1/iso-8859-1, da das nur mit Rekompilation der Libs zu ändern ist, war das wohl auch bei dir der Standard.
        Ändert kann man das dynamisch per SET NAMES.
        Problem: Wenn man SET NAMES 'utf8' verwendet, der Browser allerdings keine UTF8 Daten schickt, oder umgekehrt SET NAMES nicht verwendet, aber der Browser schickt schon utf8-Daten. Dann geht nämlich der Server von einem Zeichensatz aus in dem er die Daten bekommt, in dem diese Daten allerdings nicht kommen, demnach werden diese kaputt gespeichert und können auch nur noch kaputt ausgelesen werden.

        Das erklärt nur alles nicht dein Problem, nämlich dass Einfügen funktioniert und Auslesen nicht...
        Sind die Daten per PMA lesbar?
        Wenn nein ist das Eintragen kaputt, wenn ja das Ausgeben.
        Wenn also das Eintragen kaputt ist kontrolliere ob du irgendwelche Patterns (preg_match), oder sonstige String-Funktionen auf den String anwendest. Lass dir den Query ausgeben, den du an die DB sendest: In welcher Zeichenkodierung liegt der Query vor?
        Sicher, dass SET NAMES korrekt erkannt wurde?
        SHOW VARIABLES LIKE "charset%";
        hilft
        A SET NAMES 'x' statement is equivalent to these three statements:

        SET character_set_client = x;
        SET character_set_results = x;
        SET character_set_connection = x;
        demnach müssen diese 3 Variablen nach dem SET NAMES-Query auf utf8 stehen, ansonsten ist der SET NAMES Query falsch oder fehlte ... debugging halt, muss du selbst mal gucken, da kann dir keiner helfen

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          vielen Dank ich habe da tatsächlich noch einen Mysql Klasse gefundenb in der ich das SET NAMES vergessen hatte, daran lags

          Kommentar

          Lädt...
          X