Typo3 mySQL-Datenbank auf UTF-8 umstellen bzw. konvertieren

Datenbankumstellung auf UTF-8Wem ist das noch nicht passiert? (ok, verdammt vielen) Man legt ein neues Projekt an, pflegt fröhlich Inhalte ein und freut sich, dass alles so gut läuft. Dann kommt eine neue Sprache als Anforderung und zack - die Datenbank ist entweder als standard für mySQL auf latin1_swedish_ci gestellt oder aber bei größeren typo3-Hostern wie z.B. mittwald auf latin1_german_ci. Was tun? Wie stelle ich die Datenbank auf utf-8 bzw. utf-general_ci um? Und was passiert mit den bestehenden Daten?

  • Als allererstes sollte man mit phpMyAdmin einen Datenbankdump machen. Für typo3 gibt es dieses geniale Tool zwar als Extension aber man kann darauf nicht mehr zugreifen wenn man die unten genannten Schritte vornimmt - also phpMyAdmin separat installieren! Die Datenbankzugangsdaten stehen in typo3conf/localconf.php.
    • Unter dem Reiter "Exportieren" findet man hierzu alles, was man braucht.
  • Die gespeicherte SQL-Datei kopieren und die Kopie öffnen (am besten mit notepad2). Folgende Zeilen entfernen mit "Suchen und Ersetzen" (Strg+H)
    CODE:
    1. "collate latin1_german1_ci "
    2. "DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci "
    3. " DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci"

    (leerzeichen beachten!)

  • Jetzt im phpMyAdmin die bestehenden Tabellen (auf keinen Fall die Datenbank!!) löschen. Hierzu auf den Datenbanknamen klicken, alle TABELLEN auswählen und unten im Dropdown "alle löschen" wählen.
  • Danach unter dem Reiter "Operationen" die Datenbank-Kollation auf UTF-8(utf-8_general_ci) stellen das würde bei gelöschter typo3-Datenbank auch gar nicht mehr gehen.
  • Im Reiter "Importieren" die SQL-Datei wieder in die leere Datenbank einspielen.
    Die Tabellen sollten jetzt alle auf UTF-8 gestellt sein.
  • Danach nur noch im Typo3 - Installtool folgende Schritte machen
    • Unter "Database Analyzer" COMPARE auführen.
    • Unter "All Configuration" folgendes setzen:
      • CODE:
        1. [BE][forceCharset] = utf-8

        CODE:
        1. [SYS][setDBinit] = SET NAMES utf8;
        2. SET CHARACTER SET utf8;
        3. SET SESSION character_set_server = utf8;
        4. SET character_set_connection = utf8;

        CODE:
        1. // für europäische Sprachen
        2. [SYS][multiplyDBfieldSize] = 2
        3. // für asiatische Sprachen
        4. [SYS][multiplyDBfieldSize] = 3

Fertig, total einfach und im schlimmsten Fall funktioniert nun nix mehr.
Deswegen die Datenbank vorher sichern, wichtig wichtig!

1 Star2 Stars3 Stars4 Stars5 Stars (8 votes, average: 4.13 out of 5)
Loading ... Loading ...

24 Reaktionen zu “Typo3 mySQL-Datenbank auf UTF-8 umstellen bzw. konvertieren”

  1. Stefan

    Danke für die tolle Anleitung.

    Zwei Fragen und eine Bemerkung:

    Fragen:
    1. Was bewirkt
    SET SESSION character_set_server = utf8;
    SET character_set_connection = utf8;
    2. Beim “comparen” schlägt das hier immer fehl, weil der Wert 400 zu gross ist: ALTER TABLE sys_refindex ADD KEY lookup_string (ref_table,ref_string(400)); Was kann man da tun ?

    Bemerkung: Wer MysqlDumper verwendet lösche einfach aus der SQL Datei das “DEFAULT CHARSET=latin1″ per suchen und ersetzen.

  2. Markus Giesen

    Hey Stefan,

    zu 1:
    Wenn ein Client eine Verbindung herstellt, sendet er den Namen des Zeichensatzes, den er verwenden will, an den Server. Der Server stellt auf der Basis dieses Namens die Systemvariablen character_set_client, character_set_results und character_set_connection ein. Im Endeffekt führt der Server eine SET NAMES-Operation unter Verwendung des Zeichensatznamens aus.
    (Quelle: http://dev.mysql.com/doc/refman/5.1/de/charset-connection.html)
    Heisst also nichts anderes, als dass du hier nochmal explizit sagst “egal, was ankommt, es muss als utf8 verwendet werden. Das gleiche gilt für “SET SESSION character_set_server = utf8;” Hier sagst du mySQL, dass für die aktuell gültige Verbindung utf8 als Zeichensatz verwendet werden soll.

    Wenn nach dem comparen dennoch alles funktioniert ist das “normal”. Solange alles funktioniert sollte das nicht wichtig sein. Die Tabelle “sys_refindex” zeigt die Abhängigkeiten von Inhalten auf, z.b. wenn du ein Template an mehrern Stellen in das Include-feld einbaust, dann wird dies in der “sys_refindex” von TYPO3 festgehalten, damit du weisst, dass du ein mehrfach verwendetes Template nicht direkt an Stelle a löschst, da es noch an Stelle b benutzt wird.

  3. Axel

    Bei einem Projekt für eine tschechische TYPO3 Site hat die Vorgensweise sehr gut funktioniert. Die Site ist von einem Projekt in deutscher Sprache abgeändert worden.

  4. Markus Giesen

    Hi Axel, es freut mich das zu hören. Hast du noch einen Link zu der Seite?

  5. Florian

    Hallo zusammen,

    habe das selbe Problem gehabt und vergessen die db auf utf-8 zu stellen. Leider sind nach diesem vorgang alleumlaute und sonderzeichen im frontend im arsch.

    Grüße Florian

  6. Markus Giesen

    Hi Florian, eventuell musst du deine SQL-Textdatei mit den bestehenden Umlauten noch durch das iconv Plugin laufen lassen:
    http://blechtrottel.net/iconvplugin.html
    http://prantl.host.sk/iconv/

    Danach sollte es auch gehen. Ich hoffe du hattest Backups der DB?

  7. Georg Nebel

    Wenn die Datenbank komplett auf utf-8 umgestellt ist sollte
    [SYS][multiplyDBfieldSize] = 1
    für alle Sprachen ausreichend sein.

    Grüße Georg

  8. André Bulang

    Danke für die Anleitung. Habe alle Schritte befolgt. Alle Zeichen wurden manuell in Klartext umgewandelt und reimportiert. Nur das Frontend zeigt einmal Seiten richtig dar, zum anderen mit dem Fragezeichen. Was kann ich tun?

  9. Markus Giesen

    Die Anzeige ist also gemischt meinst du?
    Prüf mal, ob die .sql Datei, nach dem Umwandeln als UTF-8 codiert abgespeichert wurde.
    Ansonsten schick mir per Mail mal den Link, ggf. kann ich ja mal reinschauen und wenn die Daten nicht supersicher sind und nicht zu groß, dann pack doch die SQL mal und schick sie rüber.

  10. André Bulang

    Hallo Markus, das Tabellenfeld HTML der Tabelle cache_pages war aus irgendwelchen Gründen nicht auf utf8_general_ci umgestellt.

    Außerdem sind in das Template noch einzutragen:
    config.renderCharset = utf-8
    config.metaCharset = utf-8

  11. Markus Giesen

    Dann läuft’s jetzt rund? Klasse! Das freut mich. Deine Ergänzungen habe ich oben noch angefügt! Danke!

  12. Andreas Burg

    Hallo André und alle,

    config.renderCharset = utf-8
    und
    config.metaCharset = utf-8

    müssen nicht gesetzt werden, sie sind schon über

    [BE][forceCharset] = utf-8

    gesetzt. Siehe TSref.

  13. Markus Giesen

    ein hin und her… :)

  14. Dominik

    Tausend Dank für diese Anleitung!
    Hat auch für meine inzwischen ein paar tausend Einträge wunderbar funktioniert :)

  15. Ture Schönebeck

    Habe ein Problem mit dem Cache:
    Alles so durchgeführt wie oben beschrieben, es wird auch alles im BE und FE korrekt dargestellt - wenn der Seitencache leer ist!
    Sobald eine Seite erneut aufgerufen wird, kommt die Meldung “ERROR - No template found!”
    In der Tabelle “cache_pages” stehen nur die Felder “hash” und “HTML” auf Kollation “utf8_unicode_ci”.

    Hat jemand einen Tipp?

  16. Ture Schönebeck

    …es ist die Tabelle “cache_hash”! Wird diese gelleert, so werde die Seiten (einmalig) wieder angezeigt.

  17. Winfried Kuiper

    Hallo,

    das Problem mit dem Cache ist unter
    http://bugs.typo3.org/view.php?id=6006

    genauer beschrieben.
    Bei mir hat es geholfen im Installtool
    den Eintrag
    SET CHARACTER SET utf8
    unter
    [SYS][setDBinit]
    zu löschen. Damit wird sonst
    SET collation_connection = utf8
    gesetzt, was bei serialized Data (cache_pages), also dem Seitencache Probleme macht.

  18. Winfried Kuiper

    Hallo,

    es wird natürlich

    SET collation_connection = @@ collation_database

    gesetzt. Da bei mir
    collation_database = utf8_general_ci
    ist, wird damit auch die
    collation_connection von utf8_unicode_ci auf utf8_general_ci umgestellt.
    Das macht dann leider die im Bug beschriebenen Probleme.

  19. Ulli

    Das Importieren dauert ewig bei mir und belastet den Computer ziemlich stark. Kann man nicht das einfach mit mysql < dateiname machen.
    Markus: Klar kann man das, aber viele User haben keinen Shell Zugriff und müssen daher mit PHPMyAdmin und den zur Verfügung stehenden Mitteln arbeiten

  20. Ulli

    Ich finde die Anleitung recht kompliziert und hat bei mir auch nicht weitergeholfen. Das folgende Vorgehen dagegen führte zum Erfolg.
    1. Daten aus Datenbank rausschreiben (z.B. mit mysqldump)
    2. Daten nach UTF-8 kodieren
    3. Sicherstellen, dass Daten im UTF-8-Format vorliegen. Kann man z.B. mit einer UTF-8-Konsole
    (unter Linux: LC_CTYPE=de_DE.UTF-8 xterm -fn ‘-Misc-Fixed-Medium-R-SemiCondensed–13-120-75-75-C-60-ISO10646-1′)
    überprüfen. Alle Umlaute sollten richtig dargestellt werden bei Ausgabe der Datei mit more.
    4. SQL-Datei editieren. Alle CREATE DATABASE-Anweisungen sollten enden mit: “default character set ‘UTF8′; ” (doppelte Anführungszeichen natürlich nicht mit eingeben).
    5. Ebenso verfahren mit allen
    CREATE TABLE-Anweisungen.
    6. Alle Vorkommen von LATIN1/latin1 in der Datei entfernen wie oben beschrieben
    7. Alte Datenbank löschen mit DROP database name;
    8. UTF8-Konsole öffnen (wichtig, dass UTF-8!)
    9. Eingabe mysql –default-character-set=UTF8 -u username -p

    Markus: Die meisten User kommen damit sehr gut klar. Eventuell bist du eher der bash-Typ, (sieht ganz so aus;) ), da ist es natürlich per Console wesentlich komfortabler, allerdings haben wie gesagt nicht alle User Zugriff darauf. Auf jeden Fall vielen Dank für die Beschreibung unter Linux!

  21. wuschel

    hi alle zusammen,

    sorry es ist vielleicht nicht der richtige Bereich aber ich brauche hilfe und bin ganz neu.
    Wie kann ich aus der Datenbank befindlichen Daten in einem PDF Datei per typo3 umwandeln und zum Download bereitstellen lassen?

    mfg

    yuecel

  22. David

    die anleitung kann nicht funktionieren!
    problem dabei ist dass nämlich das im mysqldump mit suchen ersetzen fein die latinxyz angaben mit utf8 ersetzt werden aber alle daten noch in latin vorliegen! schaut man sich im editor die angaben zur zeichencodierung an ist die datei mit latin gekennzeichnet!(ganz sicher) wandelt man die dateicodierung in utf8 um hat man zeichenschrott. den zeichenschrott hat man nacher auch im typo3 wenn man die datei so importiert wie oben beschrieben, ja auch wenn es im frontend richtig angezeigt wird weil typo3 da schummelt. sobald die zeichensätze beim bearbeiten gemischt werden gibts chaos.
    Am einfachsten ist die mysql default collation auf utf8 zu stellen damit das NIEEE WIEDER passiert. so werden automatisch alle datenbanken und tables in utf8 erstellt. in der export datei dann alle collation anweisungen löschen und die datei mit einer beliebigen methode nach utf8 convertieren. unter linux zum beispiel so:
    iconv –from-code=ISO-8859-1 –to-code=UTF-8 dump.sql > utfsupi.sql
    importiern und bums fertig

  23. komma

    hallo wuschel,
    mit fpdf kannst du ein pdf deiner daten erstellen.
    schau einfach auf die internetseite ( ist sehr gut erklärt ).
    gruß komma

  24. Stefan

    Gute Anleitung, hat mir aus einem aktuellen Problem geholfen - vielen Dank!

Einen Kommentar schreiben

Please copy the string IP7cyF to the field below: