praetor: MySql-DB mit kyrillischen Daten

Hallo,

zum Thema meiner Fragestellung habe ich schon einen Thread unter http://forum.de.selfhtml.org/archiv/2007/5/t151490/ gefunden, der (mich) aber leider nicht zu einer Lösung geführt hat.

Ich habe eine Datenbank mit Textfeldern, die sowohl lateinische als auch kyrillische Textdaten enthalten => klarer Fall, utf8!

In PhpMyAdmin klappt es wunderbar, ich kann die kyrillischen Texte (neben den lateinischen) wunderbar eingeben und abfragen.

Mein eigenes PHP-Skript empfängt anstelle des kyrillischen Textes irgendwelche nichtlateinischen Daten, die es aber als sinnlosen Zeichensalat darstellt. Änderungen in der Zeichenkodierung des Browsers schufen keine Abhilfe.

Ich habe nun zur Eingrenzung des Problems mir sowohl im PMA als auch in meinem Skript mit "SHOW VARIABLES" die jeweilige Variablenliste ausgeben lassen. Sie ist auf beiden Seiten identisch. Hier der Auszug, der mir maßgeblich erscheint:

character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\ collation_connection utf8_bin
collation_database latin1_general_ci
collation_server latin1_general_ci
completion_type 0

Die Abfrage in meinem PHP-Skript sieht so aus:

mysql_query("SET CHARACTER SET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_bin'");
$result = mysql_query("SELECT * from gesetze") or die (mysql_error());

Ja, und im Header der HTML-Ausgabe ist natürlich UTF8 als Kodierung angegeben. Mit Umlauten und deutschen Sonderzeichen klappts ja auch klaglos.

Mit utf8_encode/_decode habe ich experimentiert, aber ich bekomme ums V... keinen kyrillischen Text heraus.

Kann jemand meine Nase auf das stoßen, was ich übersehe?

Beste Grüße
praetor

  1. echo $begrüßung;

    mysql_query("SET CHARACTER SET utf8");
    mysql_query("SET NAMES 'utf8' COLLATE 'utf8_bin'");

    Das ist doppelt gemoppelt. SET NAMES überschreibt die Einstellung von SET CHARACTER SET. Außerdem ist SET CHARACTER SET höchstens dann eine sinnvolle Option, wenn man sich der Funktionsweise bewusst ist. Ansonsten kann es bei unsachgemäßer Anwendung zu Datenverlust führen.

    Mit utf8_encode/_decode habe ich experimentiert, aber ich bekomme ums V... keinen kyrillischen Text heraus.

    Warum? ISO-8859-1 kennt keine kyrillischen Zeichen, weswegen diese Funktionen für dich sowieso nicht anwendbar sind.

    Kann jemand meine Nase auf das stoßen, was ich übersehe?

    Ich nicht, denn das kann ich deiner Beschreibung nicht entnehmen. Prüfe das Ergebnis der Datenbankabfrage. Welche Bytefolge erhältst du für ein paar definierte Test-Zeichen? Stimt diese mit der UTF-8-Kodierung für diese Zeichen überein? Eine Bytefolge sichtbar machen kann man in PHP z.B. mit chunk_split(bin2hex($delinquent), 2, ' ') oder auch url_encode($delinquent)

    echo "$verabschiedung $name";

    1. mysql_query("SET CHARACTER SET utf8");
      mysql_query("SET NAMES 'utf8' COLLATE 'utf8_bin'");

      Das ist doppelt gemoppelt...

      OK.

      ISO-8859-1 kennt keine kyrillischen Zeichen, weswegen diese Funktionen für dich sowieso nicht anwendbar sind.

      Das hatte ich mir auch gedacht. War pure Verzweiflung.

      Kann jemand meine Nase auf das stoßen, was ich übersehe?

      Ich nicht, denn das kann ich deiner Beschreibung nicht entnehmen. Prüfe das Ergebnis der Datenbankabfrage. Welche Bytefolge erhältst du für ein paar definierte Test-Zeichen? Stimt diese mit der UTF-8-Kodierung für diese Zeichen überein? Eine Bytefolge sichtbar machen kann man in PHP z.B. mit chunk_split(bin2hex($delinquent), 2, ' ') oder auch url_encode($delinquent)

      Hm. So soll es aussehen (Das zeigt mir auch PMA so an):

      • Гражданский кодекс

      Das zeigt die eigene Abfrage (urlencoded):

      • %D0%93%D1%80%D0%B0%D0%B6%D0%B4%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9+%D0%BA%D0%BE%D0%B4%D0%B5%D0%BA%D1%81

      "urlunencoded" :) gibt es krude Sonderzeichen, die ich als „discouraged characters“ hier nicht mal posten kann.

      Wird da jemand schlau draus?

      gruß
      praetor

      1. echo $begrüßung;

        Hm. So soll es aussehen (Das zeigt mir auch PMA so an):

        • Гражданский кодекс

        Das zeigt die eigene Abfrage (urlencoded):

        • %D0%93%D1%80%D0%B0%D0%B6%D0%B4%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9+%D0%BA%D0%BE%D0%B4%D0%B5%D0%BA%D1%81

        Das sieht doch gemäß http://www.tachyonsoft.com/uc0004.htm nach UTF-8 aus.

        D0 93 steht für Г
        D1 80 = р
        D0 B0 = а
        D0 B6 = ж

        usw.

        echo "$verabschiedung $name";

      2. Sancta simplicissima! Alles läuft prima. Ich habe nur in dem Skript die utf8-kodierte Ausgabe _nochmal_ utf8_encoded.

        Sorry
        :)