schildi: mysql - latin1 nach utf8 - umlaute

hallo,

ich gehe folgendermaßen vor, um unsere mysql-datenbank nach von latin1 utf8 zu transformieren:

1. kompletter datenbank-dump mittels mysqldump
2. zum suchen u. ersetzen lade ich den dump runter, und ersetze alle vorkommen von
latin1_german1_ci mit utf8_unicode_ci
latin1 mit utf8
3. lade den dump wieder hoch
4. convertiere mittels iconv nach utf-8,
   wobei sowohl
   iconv -f ISO-8859-1 -t UTF8
   als auch
   iconv -f LATIN1 -t UTF8

nicht zum gewünschten ergebnis führt, insofern dass, nach dem
   reimport in die datenbank
   - Euro-Zeichen nicht korrekt umgesetzt werden
   - Wörter oder ganze Sätze teilweise an den Umlauten abgeschnitten
     werden
   - teilweise scheinen noch andere umsetzungsprobleme bei machen
     sonderzeichen aufzutreten.

  • SET NAMES 'utf8'; setze ich für die mysql-verbindung

  • die datenbank ist ebenfalls komplett auf utf8 eingestellt.

  • was mache ich falsch? - oder bleibt nur eine manuelle ausbesserung?

  1. [...]

    iconv -f ISO-8859-1 -t UTF8

    [...]

    - Euro-Zeichen nicht korrekt umgesetzt werden

    [...]

    Nur mal am Rande: Ist das Euro-Zeichen in ISO-8859-1 überhaupt enthalten? War das nicht in ISO-8859-15? (Mal so aus dem Gedächtnis...)

    Nick

    --
    --------------------------------------------------
    http://www.xilp.eu
    XILP Internet Links People
    Dein persoenliches privates Netzwerk
    aus Freunden, Verwandten, Bekannten und Kollegen.
    --------------------------------------------------
    1. [...]

      iconv -f ISO-8859-1 -t UTF8
      [...]
         - Euro-Zeichen nicht korrekt umgesetzt werden
      [...]

      Nur mal am Rande: Ist das Euro-Zeichen in ISO-8859-1 überhaupt enthalten? War das nicht in ISO-8859-15? (Mal so aus dem Gedächtnis...)

      naja - beim umwandeln bin ich mir ja auch net ganz sicher, ob ich nun von latin1 nach utf-8 umwandeln muss oder iso-8859-1 oder evtl -15 ?...

      Nick

  2. Hallo

    jetzt mal ne gaanz noobige Frage: Wieso willst du das überhaupt umstellen? Ich hab auch ne MySQL DB und lass die immer auf der standardeinstellung, was latin1_german1_ci ist.
    Da hab ich keine Probleme mit äöüß und anderen Sonderzeichen, Spaltennamen in denen äöü vorkommt habe ich statt dessen ae, oe, ue genommen und bevor ich Daten in die DB eintrage, lasse ich mit htmlspecialchars() alle Sonderzeichen in html code umwandeln

    1. Hallo

      jetzt mal ne gaanz noobige Frage: Wieso willst du das überhaupt umstellen? Ich hab auch ne MySQL DB und lass die immer auf der standardeinstellung, was latin1_german1_ci ist.

      das definiert ja lediglich die collation , also sortierung.

      Da hab ich keine Probleme mit äöüß und anderen Sonderzeichen, Spaltennamen in denen äöü vorkommt habe ich statt dessen ae, oe, ue genommen und bevor ich Daten in die DB eintrage, lasse ich mit htmlspecialchars() alle Sonderzeichen in html code umwandeln

      kannste gerne machen, ich will lieber saubere utf-8 daten aus der datebank, und mich in zukunft nicht mehr um sonderzeichen kümmern müssen. und sollte irgendwann mal noch mehrsprachigkeit hinzukommen..

  3. echo $begrüßung;

    ich gehe folgendermaßen vor, um unsere mysql-datenbank nach von latin1 utf8 zu transformieren:

    1. kompletter datenbank-dump mittels mysqldump

    Gibst du explizit eine zu verwendende Kodierung an? Welche MySQL-Version hat der Server, der die Ausgangsdaten liefert? Welche Default-Kodierung hat der Server.

    1. zum suchen u. ersetzen lade ich den dump runter, und ersetze alle vorkommen von latin1_german1_ci mit utf8_unicode_ci, latin1 mit utf8

    Hoffentlich hast du diese Zeichenketten nicht als Werte in deinen Daten sondern nur in den CREATE-Statements stehen.

    1. convertiere mittels iconv nach utf-8,

    [...]

    nicht zum gewünschten ergebnis führt, insofern dass, nach dem reimport in die datenbank
       - Euro-Zeichen nicht korrekt umgesetzt werden

    Waren sie denn nach dem iconv überhaupt noch intakt? (Die Beantwortung der Frage dürfte sich aber nach dem Weiterlesen erübrigen.)

    Das Euro-Zeichen ist in ISO-8859-1 bzw. Latin1 nicht enthalten. Finde zunächst heraus, welche Kodierung du vorliegen hast, falls du nicht den Export mit einer definierten Kodierung vornehmen kannst. Ein Programm, mit dem du dir die Hex-Werte anzeigen lassen kannst sollte dabei helfen (z.B. Ultraedit unter Windows). Siehe: http://de.wikipedia.org/wiki/ISO_8859-1

    MySQLs Latin1 ist übrigens Win-1252. Wenn du also MySQL-Latin1 bzw. Win-1252 vorliegen hast, sollte nun klar sein, warum iconv nicht funktioniert hat. Außerdem kannst du es dir sparen, denn MySQL ist nämlich in der Lage, Konvertierungen vorzunehmen. Wenn du also für die Verbindung Kodierung X festgelegt hast und die Felder Kodierung Y verwenden, wandelt MySQL in lesender und schreibender Richtung die Zeichen passend um. Vorausgesetzt, es ist überhaupt technisch möglich. Zeichen, die in der Zielkodierung nicht existieren, gehen verloren.

    • was mache ich falsch? - oder bleibt nur eine manuelle ausbesserung?

    Meine Empfehlung: Verwende zum Importieren die zum Exportieren verwendete Kodierung und definiere explizit beide Kodierungen bei beiden Vorgängen.

    echo "$verabschiedung $name";

    1. Meine Empfehlung: Verwende zum Importieren die zum Exportieren verwendete Kodierung und definiere explizit beide Kodierungen bei beiden Vorgängen.

      echo "$verabschiedung $name";

      danke für deine ausführliche hilfe.
      habe mich daran orientiert und im endeffekt dann den warscheinlich in erster linie ursächlichen flüchtigkeitsfehler entdeckt - iconv ausgabe nicht in datei umgeleitet :(.

      hier nochmal mein vorgehen, was endgültig zu einem sauberen ergebnis zu führen scheint:

      mysqldump --set-charset=latin1 --default-character-set=latin1 avl_db03 > avl_db03.latin1.dump.sql
      iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql

      nano avl_db03.utf8.dump.sql

      suchen und ersetzen (case-sens.):

      latin1_german1_ci utf8_unicode_ci
      CHARSET latin1  CHARSET utf8
      Ü   Ã^Ü
      ü   Ã¼
      Ö   Ã^Ö
      ö   Ã¶
      Ä   Ã^Ä
      ä   Ã¤

      mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql

      1. echo $begrüßung;

        hier nochmal mein vorgehen, was endgültig zu einem sauberen ergebnis zu führen scheint:

        mysqldump --set-charset=latin1 --default-character-set=latin1 avl_db03 > avl_db03.latin1.dump.sql
        iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql

        Den iconv-Schritt kannst du dir sparen. Lass doch die Daten in MySQL-Latin1/Win-1252.

        nano avl_db03.utf8.dump.sql
        suchen und ersetzen (case-sens.):

        latin1_german1_ci utf8_unicode_ci
        CHARSET latin1  CHARSET utf8
        &Uuml;   Ã^Ü
        &uuml;   Ã¼
        &Ouml;   Ã^Ö
        &ouml;   Ã¶
        &Auml;   Ã^Ä
        &auml;   Ã¤

        Hier musst du dich auch nicht verrenken. Wenn dein Editor Win-1252 oder ISO-8859-1 spricht, kannst du die Umlaute direkt eintippen und musst nicht die UTF-8-Bytes da reinfummeln.

        mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql

        Und dem erzählst du dann einfach, dass du Character-Set latin1 verwendest und lässt MySQL den Rest machen. Das passt schon. Wenn die Kodierungen der Felder andere sind als die Kodierung der Verbindung, wandelt MySQL das selbständig um.

        echo "$verabschiedung $name";

        1. iconv -f LATIN1 -t UTF-8 avl_db03.latin1.dump.sql > avl_db03.utf8.dump.sql

          Den iconv-Schritt kannst du dir sparen. Lass doch die Daten in MySQL-Latin1/Win-1252.

          ok.

          nano avl_db03.utf8.dump.sql
          suchen und ersetzen (case-sens.):

          latin1_german1_ci utf8_unicode_ci
          CHARSET latin1  CHARSET utf8
          &Uuml;   Ã^Ü
          &uuml;   Ã¼
          &Ouml;   Ã^Ö
          &ouml;   Ã¶
          &Auml;   Ã^Ä
          &auml;   Ã¤

          Hier musst du dich auch nicht verrenken. Wenn dein Editor Win-1252 oder ISO-8859-1 spricht, kannst du die Umlaute direkt eintippen und musst nicht die UTF-8-Bytes da reinfummeln.

          Ok. Das größe Ö hat hier eh irgendwie Probleme verursacht? Falsch kodiert?

          mysql --default-character-set=utf8 avl_db02 < avl_db03.utf8.dump.sql

          Und dem erzählst du dann einfach, dass du Character-Set latin1 verwendest und lässt MySQL den Rest machen. Das passt schon. Wenn die Kodierungen der Felder andere sind als die Kodierung der Verbindung, wandelt MySQL das selbständig um.

          Achso? Gut zu wissen.

          echo "$verabschiedung $name";

          Vielen Dank für die Hilfe.

          1. Zusammengefasst nochmal die Lösung des Problems:

            mysqldump --set-charset=latin1 --default-character-set=latin1 dbname1 > dbname1.latin1.dump.sql

            nano avl_db03.utf8.dump.sql
            suchen und ersetzen (case-sens.):

            latin1_german1_ci utf8_unicode_ci
            CHARSET=latin1  CHARSET=utf8
            &Uuml;   Ü
            &uuml;   ü
            &Ouml;   Ö
            &ouml;   ö
            &Auml;   Ä
            &auml;   ä
            &szlig;  ß
            &euro;  €
            &amp;  &
            &eacute; é
            &Eacute; É
            &agrave; à
            &Agrave; À
            &quot;  "
            [...]

            mysql --default-character-set=latin1 dbname2 < dbname1.latin1.dump.sql