Kostja: russische Zeichensätze+ üöä -> Fragezeichen

Hallo,

bin fast am verzweifeln :)

Habe die aktuelle Version von Lampp installiert. Nun möchte ich auf meiner Seite kyrilische und üäö darstellen.

Normalerweise kein Problem:

  • in der httpd.conf
    AddDefaultCharset ISO-8859-1
    AddCharset WINDOWS-1251 .cp-1251   .win-1251
    AddCharset UTF-8       .utf8

  • Metaangaben in den HTML-Files auf utf-8

  • In der DB die Tabelle eine Spalte auf utf8_general_ci

Eine Testdatei erstellt und was ist?
Richige Darstellung:

  • Einfache echo Ausgabe von russischen Buchstaben und Umlauten

Falsche Dastellung:

  • Aus der DB lesen und Ausgabe von russischen Buchstaben und üaö --> Fragezeichen an den Stellen.

Gibts da noch etwas was ich vergessen habe? Kann mir mal jemand das genaue Vorgehen beschreiben?

  1. echo $begrüßung;

    • In der DB die Tabelle eine Spalte auf utf8_general_ci
    • Aus der DB lesen und Ausgabe von russischen Buchstaben und üaö --> Fragezeichen an den Stellen.

    Vermutlich ist die Default-Kodierung des MySQL-Datenbankservers latin1 (ISO-8859-1). Wenn du keine Angaben zur gewünschten Kodierung bei der Kommunikation mit dem Client machst, wird diese Default-Einstellung verwendet. Und da nicht alle UTF-8-Zeichen mit ISO-8859-1/latin1 dargestellt werden können gibt es stattdessen Fragezeichen. Ein  SET NAMES utf8  nach jedem Verbindungsaufbau wird den Server dazu veranlassen, UTF-8 mit deinem Client zu sprechen.

    echo "$verabschiedung $name";

    1. Vermutlich ist die Default-Kodierung des MySQL-Datenbankservers latin1 (ISO-8859-1). Wenn du keine Angaben zur gewünschten Kodierung bei der Kommunikation mit dem Client machst, wird diese Default-Einstellung verwendet. Und da nicht alle UTF-8-Zeichen mit ISO-8859-1/latin1 dargestellt werden können gibt es stattdessen Fragezeichen. Ein  SET NAMES utf8  nach jedem Verbindungsaufbau wird den Server dazu veranlassen, UTF-8 mit deinem Client zu sprechen.

      Ja davon hatte ich auch bereits gelesen.

      Wenn ich bei mir neue Einträge in z.B. meinem Forum mache, werden die Zeichen alle korrekt dargestellt. Nur die bereits vorhandenen Beiträge sind mit Fragezeichen versehen.

      Gibt es da für mich eine einfache Lösung? Wenn die Spalte beitrag bei mir von latin1_swedish_ci auf utf-8 umstelle ist es damit ja leider nicht getan.

      1. echo $begrüßung;

        Wenn ich bei mir neue Einträge in z.B. meinem Forum mache, werden die Zeichen alle korrekt dargestellt. Nur die bereits vorhandenen Beiträge sind mit Fragezeichen versehen.

        Gibt es da für mich eine einfache Lösung? Wenn die Spalte beitrag bei mir von latin1_swedish_ci auf utf-8 umstelle ist es damit ja leider nicht getan.

        Durch das Umstellen der Spaltenkodierung kodiert MySQL die Daten von der alten in die neue Kodierung um. Abgesehen von prinzipbedingten Verlusten, da nicht von jeder Kodierung in eine andere verlustfrei umkodiert werden kann, kann das natürlich nur klappen, wenn die Einträge in der Spalte auch tatsächlich der deklarierten Kodierung entsprechen. Wenn du dir den Inhalt mit einer aktuellen Version von phpMyAdmin ansiehst und alles richtig dargestellt wird, kannst du davon ausgehen, dass die Daten zur Kodierung passen.
        Wenn nicht, gilt es zuerst eine Sicherheitskopie anzulegen, damit bei Korrekturversuchen eventuell zerstörte Daten wieder hergestellt werden können. Am besten ist es, eine Kopie des Datenbankverzeichnisses anzufertigen. Bei einem Dump könnten schon wieder irgendwelche Umwandlungen für Verlust sorgen. Ansonsten bietet sich noch "Tabelle kopieren" von phpMyAdmin an, dabei dürfte es auch zu keinen weiteren Verlusten kommen.
        Als nächster Schritt steht eine genau Analyse des Problems auf meinem Plan. Was soll angezeigt werden, was zeigt der phpMyAdmin stattdessen an? Macht er das auch, wenn auf der Startseite "Zeichensatz / Kollation der MySQL-Verbindung:" auf utf8_irgendwas_außer_bin_ci eingestellt ist? Sollten nur Fragezeichen kommen, dürften die Daten verloren sein, und nur noch mit menschlicher Intelligenz und Handarbeit wiederherzustellen sein.
        Vorschläge zum weiteren Vorgehen sind abhängig vom Ergebnis ...

        echo "$verabschiedung $name";

        1. Also wenn ich jedes Mal mysql_query("SET NAMES utf8"); absetze wird alles korrekt angezeigt. Auch die alten Beiträge. Gibt es denn eine Möglichkeit den MySQL-Server auf utf-8 umzustellen?

          Geht das nicht bei vielen Usern auf die Performance?

          1. echo $begrüßung;

            Also wenn ich jedes Mal mysql_query("SET NAMES utf8"); absetze wird alles korrekt angezeigt. Auch die alten Beiträge. Gibt es denn eine Möglichkeit den MySQL-Server auf utf-8 umzustellen?

            Ja. Die von mir verlinkte Handbuchseite sagt, dass für die Client-Kommunikation die Werte character_set_client, character_set_results und character_set_connection wichtig sind. (Weitere character_set_*-Werte wirken als Default-Werte an anderen Stellen. Dazu wäres es sicher nicht verkehrt, auch mindestens noch die vorangehenden Kapitel zu lesen.

            Mein Server läuft mit den Einstellungen

            character-set-server  = utf8
              default-character-set = utf8

            Solltest du noch Datenbankdateien verwenden, die unter MySQL Version 4.0 oder früher angelegt wurden, ist es wichtig, vor dem Umstellen des o.g. Defaultwertes durch alle diese Datenbanken, Tabellen und Stringfelder zu gehen und einmal die Zeichenkodierungseinstellung zu ändern. Es reicht dabei auch, die Zeichenkodierung beizubehalten und nur den Wert für die Kollation (sprich: die Sprachangabe) zu ändern. Man kann den Wert auch gleich wieder zurücksetzen. Sinn der Übung ist, dass MySQL dabei die Information zur verwendeten Kodierung in die Datenbank/Tabellendatei schreibt. Ansonsten nimmt es die Default-Kodierung des Systems an, was dann beim Auslesen für die nächsten Probleme sorgen würde.

            Geht das nicht bei vielen Usern auf die Performance?

            Apropos User. Wissen denn alle auf die Datenbank zugreifenden Clients, dass nach der Umstellung nun UTF-8-kodierte Daten auf sie zukommen und von ihnen erwartet werden? Es wäre sonst sinnvoll, die Defaulteinstellung wenigstens der drei oben genannten verbindungsrelevanten Werte auf latin1 zu belassen, damit latin1-Clients, die nicht mit SET NAMES nachgerüstet werden können, weiterhin ordnungsgemäß funktionieren. Leider zeigte sich MySQL in der Vergangenheit bei mir nicht sehr kooperativ, diese drei Werte in der my.cnf verstehen zu wollen. Es gelang mir nur, mittels

            init-connect = "SET NAMES latin1"

            die Default-Einstellung zur Client-Kommunikation auf latin1 zu bringen, wenn der Server ansonsten per Default auf utf8 stehen soll.

            Ein SET NAMES ist nur einmal nach dem Verbindungsaufbau erforderlich. Die dabei benötigte Zeit dürfte nicht sehr bedeutend sein. Sollte der Server vorher schon an der Kot^WGrenze seiner Leistungsfähigkeit arbeiten, wäre sicher mit einer Optimierung der echte Daten abfragenden Statements mehr rauszuholen, als die SET NAMES verbrauchen.

            echo "$verabschiedung $name";