Tom123: MySQL Backup in Textdatei - große Sonderzeichen falsch codiert?

Hallo,
aus meiner MySQL-Datenbank wird mit PHP ein Backup mit INSERTs in eine Textdatei geschrieben. Die Textdatei wird dabei nicht nur erstellt, sondern entsteht durch copy() aus einer anderen Datei (das muss so sein). Beim Importieren mit phpMyAdmin werden die Umlaute irgendwie falsch importiert.

Bei ein paar Nachforschungen habe ich herausgefunden, dass utf8_encode() vor dem Schreiben in die Textdatei das Problem mit den Umlauten teilweise löst. Nur die groß geschriebenen Umlaute werden noch falsch dargestellt. Also ö geht, aber Ö.

Wo könnte der Fehler liegen?

Hier noch ein paar generelle Fehlerausschlüsse:

  • MySQL Tabellen/Felder und eingefügter Inhalt sind korrekt UTF-8.
  • Zu grundeliegende Textdatei (Textdatei wird nicht neu erzeugt, sondern dupliziert, um vorhanden Inhalt mit in Backup zu holen) ist auch UTF-8.
  • Die Darstellung der Umlaute nach dem Import überprüfe ich auf der Webseite (nicht in phpMyAdmin).

Grüße
Tom123

ps: Bitte keine Diskussion über andere Backup-Software. In diesem Fall kann ich phpMyAdmin, mysqldump etc. leider wirklich nicht verwenden.

  1. Nur die groß geschriebenen Umlaute werden noch falsch dargestellt. Also ö geht, aber Ö.

    definiere "falsch dargestellt"

    ps: Bitte keine Diskussion über andere Backup-Software. In diesem Fall kann ich phpMyAdmin, mysqldump etc. leider wirklich nicht verwenden.

    ggf aber dennoch der hinweis auf die exec-funktion von php und die möglichkeit das ganze per commandline zu machen ;)

    1. Nur die groß geschriebenen Umlaute werden noch falsch dargestellt. Also ö geht, aber Ö.
      definiere "falsch dargestellt"

      Der Browser kann die Umlaute nicht darstellen. Der Firefox zeigt statt dem Umlaut ein Rechteck mit Fragezeichen darin. Im reinen Text zeigen sich auch seltsame Zeichen statt dem Umlaut.

      ps: Bitte keine Diskussion über andere Backup-Software. In diesem Fall kann ich phpMyAdmin, mysqldump etc. leider wirklich nicht verwenden.
      ggf aber dennoch der hinweis auf die exec-funktion von php und die möglichkeit das ganze per commandline zu machen ;)

      Geht leider wirklich nicht. Sonst wäre das etwas einfacher.

      1. Der Browser kann die Umlaute nicht darstellen. Der Firefox zeigt statt dem Umlaut ein Rechteck mit Fragezeichen darin. Im reinen Text zeigen sich auch seltsame Zeichen statt dem Umlaut.

        du lieferst offenbar irgend ein ansi-derivat aus, sagst aber es ist utf-8 ;)

        utf8_encode könnte das richtige für dich sein

        1. Das verwende ich ja schon.

          Mit utf8_encode() sind nur die großen Umlaute falsch dargestellt, ohne alle.

          1. Das verwende ich ja schon.
            Mit utf8_encode() sind nur die großen Umlaute falsch dargestellt, ohne alle.

            entweder alle oder garnicht - "große umlaute" liegen genauso wie die "kleinen" ausserhalb von 7-bit-ascii und sind somit in utf-8 abweichend von zb ansi-codierten-zeichen

            1. Das wundert mich auch. Es ergibt eigentlich keinen Sinn.

  2. echo $begrüßung;

    Beim Importieren mit phpMyAdmin werden die Umlaute irgendwie falsch importiert.
    Wo könnte der Fehler liegen?

    Vielleicht eine teilweise Missachtung der beiden Prinzipen: a) jedes beteiligte System muss mit der Kodierung umgehen können, b) bei einer Übertragung muss die zu verwendende/verwendete Kodierung ausgehandelt/angegeben werden.

    • MySQL Tabellen/Felder und eingefügter Inhalt sind korrekt UTF-8.

    Woraus schlussfolgerst du das, bzw. wie hast du das geprüft? Und welche Kodierung handelst du für die Verbindung zwischen Client und Server aus? Außerdem ist die Angabe der Tabellenkodierung unwichtig, weil das nur ein Defaultwert für neu zu erstellende Felder ist. Die Feldkodierungsangabe ist entscheidend.

    • Zu grundeliegende Textdatei (Textdatei wird nicht neu erzeugt, sondern dupliziert, um vorhanden Inhalt mit in Backup zu holen) ist auch UTF-8.

    Woraus schlussfolgerst du das, bzw. wie hast du das geprüft?

    • Die Darstellung der Umlaute nach dem Import überprüfe ich auf der Webseite (nicht in phpMyAdmin).

    Wie genau gehst du dabei vor?

    Bei ein paar Nachforschungen habe ich herausgefunden, dass utf8_encode() vor dem Schreiben in die Textdatei das Problem mit den Umlauten teilweise löst.

    Wann immer du denkst, utf8_encode() oder utf8_decode() verwenden zu müssen, hast du mit hoher Wahrscheinlichkeit einen gravierenden Fehler in der Verarbeitungskette. Wenn utf8_encode() ein Problem löst, und die Quelle nicht garantiert ISO-8859-1 (wirklich ISO-8859-1, kein als ISO-8859-1 getarntes Win-1252) ist, dann hat irgendwer/-was vermutlich eine verlustbehaftete Konvertierung durchgeführt.

    Nur die groß geschriebenen Umlaute werden noch falsch dargestellt. Also ö geht, aber Ö.

    Vermutlich hast du ein Kodierungen-Chaos. Eine Hexwerte-Analyse kann Aufschluss geben, was da konkret schiefgelaufen ist, falls dich das interessiert.

    echo "$verabschiedung $name";