2010-11-23 18 views
0

Hay, Ich habe eine einfache Anwendung, wo Benutzer Inhalte in eine MySQL-Datenbank hochgeladen, jedoch einige Einheiten werden nicht codiert. Dinge wie diese erscheinenMySQL speichert im Feld

ââ¬Å 

anstelle von Anführungszeichen und was nicht. Ich weiß, dass sollte diese Werte in HTML-Entities codiert haben, wenn sie in die Datenbank eingefügt wurden, jedoch gibt es jetzt ein paar tausend Zeilen, die Daten enthalten.

Haben wir eine PHP-Funktion, um diese Werte zu codieren, wenn die Daten an den Browser zurückgegeben werden?


Alex Brown Update. Da Codierung hier ein Problem sein kann, auch hier ist das, was ich sehe:

alt text

+1

Welche Zeichencodierung verwenden Sie in Ihrer Datenbank, für die Verbindung und für die Ausgabe? – Gumbo

+0

Ist dies DEFAULT CHARSET = latin1; – dotty

+0

Wir können das nicht rückgängig machen, ohne zu wissen, welches Gebietsschema/welcher Zeichensatz verwendet wurde. – stillstanding

Antwort

4

Ihr Browser des Benutzers Daten einreichen, die UTF-8 codiert sind, aber Sie mit einer Datenbank verbinden, die Sie 1) setzt voraus, übermitteln latin1-codierte Daten 2) speichert Ihre Daten als latin1-codierte Strings. Ihre Daten werden daher falsch codiert gespeichert.

Wenn Sie Daten aus der Datenbank abrufen, werden sie als latin1-Strings bereitgestellt, aber da die latin1-Strings nur falsch codierte UTF-8 sind und PHP naiv alle Strings als binäre Strings behandelt, haben Sie nur Ihren ursprünglichen UTF- 8 String wieder zurück. Wenn Sie diese Zeichenfolge auf einer HTML-Seite wiedergeben, die wiederum als UTF-8-codiert deklariert ist, wird die Zeichenfolge so angezeigt, wie sie vom Benutzer gesendet wurde.

Wenn Sie jedoch den Inhalt der Datenbank mit einer Software betrachten, die sich mit der Behandlung von Zeichensätzen von MySQL auskennt, identifiziert diese Software die Spaltenzeichensätze als latin1 und stellt sicher, dass die angezeigten Zeichen die Zeichen sind der latin1-Zeichenfolge, die, wie wir bemerkten, falsch codierte UTF-8 war. Sie sehen daher falsch codierte Daten.

Es gibt eine Reihe von Schritten, die Sie ergreifen sollten, um dies zu beheben. Zunächst erwarten Sie, UTF-8-kodierte Daten (wie auf der HTML-Ebene deklariert) zu behandeln. Sie sollten also sicherstellen, dass Sie auf diese Weise auch mit MySQL kommunizieren. Sie tun dies, indem Sie immer SET NAMES 'utf8' absetzen, wenn Sie eine Verbindung zur Datenbank herstellen. (Hinweis: Ihre Datenbank API kann eine spezielle Funktion zum Ändern eines Verbindungszeichensatzes bieten. Ich denke, die mysql API nicht, aber ich bin mir nicht sicher.)

Zweitens sollten Sie sicherstellen, dass Sie Ihre speichern Daten UTF-8 codiert. Das bedeutet, dass die Zeichensätze Ihrer Datenbankspalten utf8 sein sollten. Ein Spaltenzeichensatz kann mit der Anweisung ALTER TABLE ... MODIFY geändert werden. Vergessen Sie nicht, auch den Standard-Zeichensatz der Tabelle zu ändern (dadurch wird der Zeichensatz für neue Spalten festgelegt, die der Tabelle hinzugefügt wurden, für die Sie nicht explizit einen Zeichensatz angeben). Und ändern Sie den Datenbank-Zeichensatz, während Sie gerade dabei sind.

Wenn Sie jedoch einen Spaltenzeichensatz ändern, geht MySQL davon aus, dass die in den Zeilen dieser Tabelle bereits gespeicherten Daten nicht falsch codiert sind, sondern gültige Daten im alten Zeichensatz. Es konvertiert daher Ihre falsch codierten UTF-8-Daten (die als latin1-codierte Daten behandelt werden) in UTF-8-codierte Daten, so dass Sie mit doppelt UTF-8-kodierten Daten arbeiten. Es gibt einen Trick, um dies zu umgehen: Zuerst den Spaltenzeichensatz in den Zeichensatz binary und dann von binary in utf8 konvertieren. Auf diese Weise ändert MySQL die binäre Form der Daten nicht, weil Sie es über ein Format konvertieren, in dem es als beliebige binäre Zeichenfolgen behandelt wird.

Viel Glück!