Emanuel: Probleme mit Umlaute in MySQL 5.1.41 + PhpMyAdmin

Hallo liebe Leute!

Ich habe eine Mysql Datenbank, Version 5.1.41-3ubuntu12.3 und zum verwalten die neuste PhpMyAdmin Version 3.3.2deb1. Zusätzlich läuft Apache/2.2.14.

Anfangs war die gewünscht DB auf den Character Set latin1... eingestellt, es gab soweit keine Prbleme mit Umlaute.
Dieser charset war als Standard eingestellt und ich hatte nicht darauf geachtet. Jetzt ist es mir aufgefalln und dachte mir, dass es besser wäre auf charset utf8 collation utf8_general_ci umzustellen, weil ich die ganzen PHP Files auch utf8 kodiert speichere und die HTML Ausgabe ebenfalls utf8 ist.

Die Ausgabe der ausgelesenen Datensätze aus der DB erfolgt mit
echo htmlentities(stripslashes($ausgabe_aus_db), ENT_QUOTES, 'UTF-8');
Selbst nach der Umstellung der DB und allen zugehörigen Tabellen von latin1... auf utf8 und collation utf8_general_ci gabs bei der Webseitenausgabe keinerlei Probleme.
Auch bei normaler ausgabe der aus der DB ausgelesenen Daten gibts keine Probleme, mit
echo htmlentities(stripslashes($ausgabe_aus_db), ENT_QUOTES, 'UTF-8');
steht im Quellcode dann für ä zb. ä
und mit einem normalen
echo $ausgabe_aus_db;
steht im Quellcode direkt das ä und wird auch richtig angezeigt.

Tja und wenn ich mir die Datensätze die in der DB stehen mit PhpMyAdmin anschaue, dann sehe ich die utf8 kodierten Zeichen für die Umlaute, z.B. statt ä steht ä. Dementsprechend dürfte die utf8 kodierung der Eingaben auf der Website in die DB richtig funktionieren, aber PhpMyAdmin zeigt mit die kodierten Einträge an und dekodiert sie nicht wenn ich das richtig verstehe.
Wenn ich mit PhpMyAdmin die Umlaute in die DB eintrage werden sie mir in PhpMyAdmin richtig angezeigt (ä und nicht ä) und auch auf der Website werden die Zeichen richtig dargestellt.

Wo kann das Problem liegen, dass die über die Website eingegebenen Umlaute im PhpMyAdmin nicht richtig angezeigt werden?

In der Apache config ist auch folgendes eingetragen:
AddDefaultCharset UTF-8

Ich hoffe, dass mir jemand behilflich sein kann :)

LG Emanuel

  1. Hallo,

    echo htmlentities(stripslashes($ausgabe_aus_db), ENT_QUOTES, 'UTF-8');

    weder stripslashes() noch htmlentities() sind geeignete Funktionen, um Daten in einen HTML-Kontext zu bringen. Du verfälschst wunderbar Deine Daten, mehr nicht.

    Ich empfehle Dir den Artikel Kontextwechsel.

    Freundliche Grüße

    Vinzenz

    1. Hallo!

      Gut, danke für den Hinweis, den Artikel werde ich mir durchlesen.

      ---------

      Die Lösung zu meiner initialen Fragestellung habe ich natürlich gleich nach absenden des Beitrages und nochmaliger Google Suche gefunden...

      Uzw. habe ich nach erfolgreichem DB-Verbindungsaufbau noch ein
      mysql_set_charset("utf8", $this->dbh);
      eingefügt.
      Jetzt klappts, es werden alle Sonderzeichen auch im PhpMyAdmin richtig angezeigt.
      Vielleicht kann mir wer erklären, wieso ich den charset nochmals explizit für die Verbindung angeben muss, obwohl dieser sowieso in der Dankenbank eingetragen ist.

      LG Emanuel

      1. Hallo,

        Vielleicht kann mir wer erklären, wieso ich den charset nochmals explizit für die Verbindung angeben muss, obwohl dieser sowieso in der Dankenbank eingetragen ist.

        klar: SELFHTML-Wiki, Thema Zeichencodierung/MySQL

        Freundliche Grüße

        Vinzenz

  2. Hi!

    Die Ausgabe der ausgelesenen Datensätze aus der DB erfolgt mit
    echo htmlentities(stripslashes($ausgabe_aus_db), ENT_QUOTES, 'UTF-8');

    Wenn du schon mit UTF-8 arbeitest, brauchst du keine Entities oder nummerische Zeichenreferenzen (NCR) für die Zeichen jenseits von ASCII. htmlentities() ist deshalb zu viel, htmlspecialchars() reicht völlig (da kann auch der charset-Parameter entfallen, denn alle behandelten Zeichen sind ASCII und bei ISO-8859-1 und UTF-8 eineindeutig und gleich kodiert).

    Selbst nach der Umstellung der DB und allen zugehörigen Tabellen von latin1... auf utf8 und collation utf8_general_ci gabs bei der Webseitenausgabe keinerlei Probleme.

    Du schickst also UTF-8-kodierte Daten an MySQL und bekommst auch solche wieder zurück. Soweit scheint das also problemlos zu klappen.

    Tja und wenn ich mir die Datensätze die in der DB stehen mit PhpMyAdmin anschaue, dann sehe ich die utf8 kodierten Zeichen für die Umlaute, z.B. statt ä steht ä. Dementsprechend dürfte die utf8 kodierung der Eingaben auf der Website in die DB richtig funktionieren, aber PhpMyAdmin zeigt mit die kodierten Einträge an und dekodiert sie nicht wenn ich das richtig verstehe.

    Mir ist nicht bekannt, dass der PMA Fehler bei der Zeichenkodierung macht. Man kann erst einmal davon ausgehen, dass er nach seinen Möglichkeiten alles richtig anzeigt. Das Problem ist nur, dass du beim Schreiben in das DBMS selbigem nicht mitgeteilt hast, welche Kodierung du verwendest. Lies erst einmal http://wiki.selfhtml.org/wiki/Themen:Zeichencodierung/MySQL und wenn du dann noch Fragen hast, stell sie.

    Insbesondere wirst du nun wissen, dass deine Daten in der Tabelle kaputt sind und wirst sie reparieren wollen.
    1. Erstelle einen Dump/Export mit dem PMA. Je nach PHP- und PMA-Konfiguration wirst du eine Kodierung beim Export angeben können oder nicht.
    2.a) Wenn ja wähle Latin1. Wenn du dir die Datei in einem Browser öffnest und den auf UTF-8 stellst (meist im Menü Ansicht->(Zeichen)kodierung), solltest du die Umlaute richtig sehen können.
    2.b) Konntest du beim Export nichts auswählen, musst du die Datei einmalig als UTF-8 öffnen, dabei ä für ä usw. sehen und sie nach Latin1 konvertiert speichern. Alle UTF-8-fähigen Editoren sollten das können.
    3. Importiere die Datei wobei du UTF-8 angibst.
    Jetzt sollte der PMA alles richtig anzeigen. Und wenn du den verlinkten Artikel gelesen und dein PHP-Code angepasst hast, sollte auch da alles stimmen.

    Lo!

  3. Super, besten Dank für die schnelle Hilfe @dedlfix & @Vinzenz Mai