DieKerstin: Probleme mit Zeichencodierung

Hallo,

ich möchte eine MySQL Tabelle (mit Inhalt) von einer MySQL DB auf eine andere portieren.

Wenn ich nun die Tabelle mit mysqldump datenbankname tabellennamen foo.sql exportiere und im Zielsystem mit phpmysqladmin importiere werden die Umlaute als ? angezeigt.

Ich vermute, daß mein Quell- und Zielsystem mit unterschiedlichen Zeichencodierungen arbeiten.

Beim Zielsystem ist im phpmysqladmin "utf8" eingestellt.

Wie ermittele ich die Zeichencodierung der Quell-DB?

Wie kann ich eine Zeichencodierung in eine andere Zeichencodierung konverteieren so daß die Sonderzeichen richtig umgesetzt werden?

LG Kerstin

  1. hi,

    Wie ermittele ich die Zeichencodierung der Quell-DB?

    Gute Frage! Ich würde mir ersteinmal die Quellen vornehmen, also die Anwendungen, welche die Daten geliefert haben. Das dürfte am meisten erfolgsversprechend sein. Die vorhandenen Daten anschauen, nunja, da hast Du schnell was übersehen.

    Wichtig ist auch die Vorgänger-Version von MySQL, also wie die Tabellen deklariert sind. Das ist aber nur ein Hinweis, der sagt nichts über die wirkliche Kodierung aus.

    Hotte

  2. Beim Zielsystem ist im phpmysqladmin "utf8" eingestellt.

    Wie ermittele ich die Zeichencodierung der Quell-DB?

    Reinschauen mit phpmyadmin

    Wie kann ich eine Zeichencodierung in eine andere Zeichencodierung konverteieren so daß die Sonderzeichen richtig umgesetzt werden?

    Mit einem Editor. Unter Linux z.B. gedit. Da kannst du beim Abspeichern die Codierung angeben. An der Stelle, wo du den Namen der DAtei schreiben musst.

    LG Kalle

  3. Hi!

    Wenn ich nun die Tabelle mit mysqldump datenbankname tabellennamen foo.sql exportiere und im Zielsystem mit phpmysqladmin importiere werden die Umlaute als ? angezeigt.

    Exportiere sie lieber mit expliziter Angabe der gewünschten Kodierung. Dafür gibt es einen Parameter. Beim Importieren solltest du ebenfalls die beim Exportieren verwendeten Kodierung angeben. Am besten ist es, wenn du dafür UTF-8 nimmst, damit lassen sich praktisch alle Zeichen verlustfrei darstellen.

    Wie ermittele ich die Zeichencodierung der Quell-DB?

    Das ist unerheblich. Die Kodierungsangabe der Felder dient nur zur Datenablage. Gelesen und geschrieben werden sie mit der auf der Client-Verbindung eingestellten Kodierung. MySQL kodiert da gegebenenfalls selbständig um, wenn die Kodierungen unterschiedlich angegeben worden sind.

    Wie kann ich eine Zeichencodierung in eine andere Zeichencodierung konverteieren so daß die Sonderzeichen richtig umgesetzt werden?

    So ein Umkodieren geht prinzipbedingt nicht in jede Richtung verlustfrei. Deswegen durchgängig UTF-8 verwenden, dann geht nichts verloren.

    Umkodieren kannst du das mit entsprechenden Werkzeugen, beispielsweise iconv (sowohl PHP-Extension als auch Unix-Software). Doch du brauchst das in deinem Fall nicht, weil du beim Ex- und Importieren bereits die zu verwendende Zeichenkodierung angeben kannst.

    Lo!

    1. Hi!

      Exportiere sie lieber mit expliziter Angabe der gewünschten Kodierung. Dafür gibt es einen Parameter.

      Kannst Du mir das bitte noch etwas genauer beschreiben. Habe zwar schon eine Weile gegooglet, finde aber nichts richtiges.

      Vielen Dank,

      Kerstin

      1. Hi!

        Exportiere sie lieber mit expliziter Angabe der gewünschten Kodierung. Dafür gibt es einen Parameter.
        Kannst Du mir das bitte noch etwas genauer beschreiben. Habe zwar schon eine Weile gegooglet, finde aber nichts richtiges.

        Die meisten Programme haben eine Dokumentation. Die von MySQL ist auf alle Fälle keine schlechte. Mit den richtigen Stichwörtern findet sicher auch Google die pasende Stelle, aber man kann auch gezielt vorgehen.

        Reference Manual -> 4 MySQL Programs -> 4.5 MySQL Client Programs -> 4.5.4. mysqldump - A Database Backup Program

        (Auf die Kapitelnummerierung kann man sich nicht immer verlassen. Das Handbuch wird gelegentlich umstrukturiert und dann stimmen die angegebenen Nummern nicht mehr. Deswegen lasse ich sie im Allgemeinen zwar weg, zum besseren Nachvollziehen führte ich sie aber jetzt mal mit an.)

        Die Parameter müssen etwas mit Zeichenkodierung zu tun haben. "encoding" kommt nicht vor. MySQL spricht immer vom "charset". Erste Fundstelle auf der Seite sagt, dass --set-charset in --opt gesetzt ist. Etwas weiter steht, dass --opt der Default-zustand ist. Dann kommt eine Tabelle mit allen Optionen, die mysqldump kennt. Bei --set-charset steht: "Add SET NAMES default_character_set to the output". Damit wäre schonmal eine deiner Fragen geklärt, nämlich die, in welcher Kodierung der Export vorliegt (etwas umformuliert, weil nicht die Kodierung der Datenbank interessiert sondern die des Exports, wenn man einen solchen vorliegen hat und keine Datenbank). Am Anfang der Datei steht also ein SET NAMES-Statement, das die Export-Kodierung angibt.

        Und dann gibt es noch --default-character-set=charset_name. Damit kann man explizit angeben, welche Kodierung man haben möchte. UTF8 ist zwar die Standard-Kodierung, wenn man nichts angibt. Dabei ist jedoch zu beachten, dass nicht nur Kommandozeilenparameter sondern auch eine globale und eine benutzerspezifische Konfigurationsdatei ausgewertet werden. Ein Administrator repektive Anwender kann darin etwas vom Defaultwert abweichendes konfiguriert haben. Deswegen entweder eine explizite Angabe verwenden oder wissen, was umkonfiguriert wurde, und bei Ungewissheit nach dem Export lieber noch mal in die Datei schauen.

        Ein wichtiger Punkt bei Kodierungen ist auch noch, dass die Daten gemäß der angegebenen oder per Default eingestellten Kodierung an MySQL übergeben werden müssen. Wenn MySQL von beispielsweise Latin1 ausgeht, ein Script aber fleißig UTF-8 sendet, weil vergessen wurde, nach dem Verbindungsaufbau explizit UTF-8 auszuhandeln, kommt Murks in der Datenbank zu stehen. Falsche Angaben kann MySQL nicht automatisch erkennen und korrigieren.

        Lo!