Datenbank-Konvertierung auf utf-8

16. Februar 2009 | Von stefan | Kategorie: Datenbank-Konvertierung auf utf-8

Wer seine Datenbank auf utf-8 umstellen möchte, sieht sich oftmals mit einer Reihe von Problemen konfrontiert.

  • Wie geht man die Umstellung am besten an?
  • Was ist zu beachten?
  • Was ist, wenn danach nichts mehr funktioniert?

Das Thema wird zwar in vielen Foren und Blogs behandelt, derzeit sind die meisten Vorschläge und Ansätze jedoch sehr fragmentarisch gehalten.
Die Umstellung einer Datenbank kann selbstverständlich nicht nur bei TYPO3 Installationen sinnvoll sein, sondern z.B. auch bei Drupal, Joomla, OpenCms usw. – oder aber allgemein beim Einsatz von Datenbanken im Rahmen einer Webinstallation.
Spätestens, wenn Probleme mit der Darstellung von Umlauten auftauchen oder Mehrsprachigkeit erforderlich ist, bietet sich das utf-8 Format für die Datenbank an. Das utf-8 Format ermöglicht eine globale Zeichenkodierung im Internet.

Umstellung einer Datenbank von charset=iso-8859-1 auf utf-8
Einige Hoster verwenden noch heute [Stand: Februar 2009] veraltete Versionen von MySQL-Datenbanken. So weist beispielsweise 1&1 gerne darauf hin, „Europas größter Hoster“ zu sein. Was 1&1 allerdings nicht daran hindert, noch immer die stark veraltete MySQL-Version 4.0.27 zu verwenden, die mit sehr vielen Fehlern behaftet ist. Mit Version 4.0.x wurde zwar utf8-Unterstützung eingeführt, jedoch nur sehr rudimentär. Wenn überhaupt noch eine 4er Version zum Einsatz kommt, sollte sie mindestens in Version 4.1.x vorliegen. Zwar bietet der Hoster 1&1 auch MySQL 5 Datenbanken an, verunsichert Webmaster aber mit dem Hinweis, diese Version wäre noch nicht ausgereift und solle nur dann verwendet werden, wenn unbedingt erforderlich. Es dürfte nicht verwundern, dass diese veralteten MySQL-4 Datenbanken noch das charset=iso-8859-1 voreingestellt haben.

TYPO3 lässt sich mit utf-8 codierter Datenbank wesentlich besser betreiben als mit charset=iso-8859-1. Ein Beispiel: Wer schon einmal versucht hat mit einer charset=iso-8859-1 Datenbank, bei Mailformplus Felder zu validieren, hat wohl schnell gemerkt, dass Eingabefelder mit Umlauten nicht akzeptiert werden.

Wer große Hoster dazu bewegen möchte, die Datenbankversion zu aktualisieren, steht in der Regel auf verlorenem Posten. Setzt der Hoster auf stark veraltete Versionen, im vorigen Beispiel 1&1 auf MySQL 4.0.27, so bietet sich an, die alternativ zur Verfügung gestellte MySQL-5 Datenbank einzusetzen.

Es gibt zwei Möglichkeiten:
Die alte Datenbank wird (nach der Erstellung eines Backups!) gelöscht und eine neue Datenbank aufgesetzt. Oder die alte Datenbank wird beibehalten und es wird parallel dazu eine neue Datenbank aufgesetzt. Die Daten werden dann in die neue DB eingespielt und anschließend wird TYPO3 auf die neue Datenbank umgeschaltet. Nachfolgend wird die zweite Möglichkeit beschrieben:

Wie änderte man eine funktionierende Typo3-Installation so um, dass die neue MySQL-5 Datenbank (mit utf-8) Verwendung findet?
Bleiben wir beim Beispiel 1&1. Natürlich kann man dem Rat diverser Forenbenutzer folgen und „sich einen anständigen Hoster suchen“. Dem steht häufig entgegen, dass ein entsprechender Aufwand gescheut wird, der Kunde den Hoster nicht wechseln möchte usw.

Wir hatten das Problem, dass 1&1 als Hoster beibehalten werden sollte. Eine Inspektion der Datenbank ergab schnell, dass die Umlaute in der alten MySQL-4 DB von 1&1 fehlerhaft abgespeichert gewesen waren. Im Frontend war davon nichts zusehen, da korrekt konvertiert wurde. Würde man hingegen die DB-Inhalte exportieren und sie auf die neue MySQL-5 DB (mit utf-8 Einstellung) aufspielen, so blieben die korrumpierten Zeichen bestehen und würden dann im Frontend fehlerhaft angezeigt werden.

Ausweg: Man muss erst per Hand alle Fehler korrigieren. Das geht für ä,ö,ü,Ä,Ö,Ü,ß zwar per automatisches „Suchen und ersetzen“, nicht aber für Gedankenstriche und Anführungszeichen, die alle durch ein „?“ ersetzt werden und daher händisch korrigiert werden müssen.

Schritt für Schritt:
Anmerkung: Wir sprechen nachfolgend zum Zweck einer besseren Unterscheidbarkeit stets von der „neuen MySQL-5 Datenbank“ und der „alten MySQL-4 Datenbank“. Selbstverständlich können neue und alte Datenbank dieselbe Version aufweisen. Es sollte aus vorgenannten Gründen aber eine MySQL-Datenbank mindestens in Version 4.1.x eingesetzt werden.

  1. Neue MySQL-5 Datenbank mit utf-8 erstellen:
    Es wird eine neue, leere MySQL-5 Datenbank eingerichtet und mit phpMyAdmin unter „Operationen“ – „Kollation“
    “utf8_general_ci“ festlegen.
  2. Das Programm mysqldumper beziehen (http://www.mysqldumper.de) und zwei Mal auf dem Server installieren, z.B. im Verzeichnis „mysqldumperDB4“ und „mysqldumperDB5“.
    Konfiguration von mysqldumper mit den Zugangsdaten für die alte MySQL-4 und die neue MySQL-5 Datenbank.
  3. Mit mysqldumperDB4 ein Backup der alten 4er Datenbank machen und auf die eigene Festplatte holen (GZ-gezippt) – dieses Backup aufbewahren, falls was schief geht!!! Backup duplizieren, und eine unveränderte Version der alten Datenbank aufbewahren, GZ-gezippte Datei mit einem guten Kompressionsprogramm entpacken (z.B. 7-zip). Direkter Weg:
    Die entpackte Datei mit einem Programm wie TextPad (nicht Microsoft Word!) editieren (www.textpad.com) und im utf8-Format neu abspeichern. Dieses Datei neu GZ-komprimieren, mit mysqldumperDB5 importieren (in mysqldumper uploaden) und in die NEUE (5er) Datenbank hochladen.
    Der direkte Weg funktioniert allerdings nur, wenn in der ursprünglichen MySQL4-Datenbank keine korrumpierten Zeichen vorlagen. Andernfalls:

    Komplizierterer Weg:

    Die Datei muss manuell mit TextPad angepasst werden. Die korrumpierten ä,ö,ü,Ä,Ö,Ü,ß lassen sich per „Suchen und alle ersetzen“ automatisch ändern, bei Anführungsstrichen und Gedankenstrichen (und ein paar anderen Dingen) wird immer „?“ gesetzt. Es müssen also alle „?“ gesucht und kontrolliert werden.
    Nach der inhaltlichen Korrektur vorgehen wie beim zuvor genannten „einfacheren Weg“ (utf-8 abspeichern, GZ-zip, importieren).

    Bestenfalls klappt der Import und die anschließende Darstellung reibungslos. In der Praxis kann es dazu kommen, dass die Zeichensätze beim Import in die neue DB wieder vermurkst werden! Dann bleibt nur,Schritt für Schritt per Copy & Paste den Code aus TextPad in das SQL-Befehlsfenster von phyMyAdmin zu kopieren und so Tabelle für Tabelle in der neue MySQL-5 DB zu erstellen.

  4. Zwischenbilanz:
    Im Idealfall haben wir nun eine saubere neue Datenbank ohne Fehler, die utf-8 codiert ist. Die alte MySQL-4 DB und die neue MySQL-5 DB existieren parallel auf dem Server.
  5. Nun braucht man nur noch zu “switchen”. D.h. TYPO3 zu sagen, dass es die neue Datenbank verwenden soll (die alte Datenbank kann man im Anschluss aufheben oder – nach entsprechender Prüfung der Funktionsfähigkeit der neuen Datenbank - löschen). Switchen der Datebank:
    Dazu holte man sich /typo3conf/localconf.php vom Server auf den eigenen Rechner macht eine Kopie und passt in dieser den Zugriff auf die Datenbank an:

    $typo_db_username = ‘neuerWert‘;
    $typo_db_password = ‘ neuerWert ‘;
    $typo_db_host = ‘neuerWert‘;
    $TYPO3_CONF_VARS['SYS']['compat_version'] = ‘4.2.6‘; //abhängig von der TYPO3-Version
    $typo_db = ‘ neuerWert ‘;

  6. TIPP:
    Wenn man TYPO3 auf utf-8 umschaltet, so kann der unangenehme Effekt auftreten, dass die TypoScripts (Constants, Setup) bzgl. Umlaute korrumpiert werden. Deshalb ist es ratsam, sich den Code vor dem Umstellen aus der alten Installation rauszukopieren, um ihn im Anschluss wieder herstellen zu können.
  7. Bevor man die localconf.php mit den neuen Datenbankwerten auf den Server lädt, muss man noch via phpMyAdmin alle Tabellen leeren (nicht löschen!), die „cache“ im Namen haben (cache_extensions, cache_hash, cache_imagesizes,…), das sind derzeit 7 Stück. Macht man das nicht, so meldet TYPO3 nach dem Upload der neuen localconf.php freudig: „No Template found!“Nun erfolgt das upload von localconf.php und anschließendes Login in das Backend. Dort das TypoScript auf Korruption prüfen und ggf. durch das vorher kopierte TypoScript ersetzen. Zusätzlich muss ins Setup-Feld geschrieben werden:
    ############################################################
    ##############UTF-8 Zeichensatz festlegen##############
    config.metaCharset = utf-8
    config.renderCharset = utf-8
    config.additionalHeaders = Content-Type:text/html;charset=utf-8 ############################################################
  8. Jetzt ist noch TYPO3 selbst anzupassen.
    Via Installtool erschließt man den Bereich „All Configuration“ und trägt ein:

    [BE][forceCharset] = utf-8
    und ins Feld [SYS][setDBinit] = folgende vier Einträge:
    SET NAMES utf8;
    SET CHARACTER SET utf8;
    SET SESSION character_set_server = utf8;
    SET character_set_connection = utf8;

    Abschließend noch setzen:
    [SYS][multiplyDBfieldSize] = 2
    (für europäische Sprachen, 3 für asiatische Sprachen)

  9. Nun die Webseite prüfen. Es kann insbesondere natürlich sein, dass man bei der manuellen Korrektur der korrumpierten Daten aus der MySQL-4 DB in TextPad etwas übersehen oder fehlerhaft korrigiert hat.
  10. Gegebenenfalls treten in eigenen Templates oder includeten PHP-Dateien noch fehlerhafte Zeichen (z.B. „?“ statt Umlauten) auf. Dieses Problem lässt sich beheben, indem die entsprechenden Templates lokal mit TextPad geöffnet, als utf-8 abgespeichert und per FTP auf den Server geladen werden.

Vielen Dank an

Diesen Artikel bookmarken/weiterempfehlen:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • MisterWong
  • Yigg
  • Technorati
  • LinkArena
  • YahooMyWeb
  • Webnews.de

7 Kommentare
Hinterlasse einen Kommentar »

  1. Hallo Stefan,

    vielen Dank für die Blumen. Es freut mich wie Du die Informationen Deinerseits hier wieder zur Verfügung stellst und im konkreten Zusammenhang darlegst. Das ist die (Informations-)Stärke von Communities. ;)

  2. Toll! :-)
    Ein Posting vom Urheber des mysqldumpers. Das ist eine echte Ehre! Schön, dass Du diesen Beitrag entdeckt hast, Daniel. Und vielen Dank dafür, dass Du so ein tolles Tool entwickelt hast und frei zur Verfügung stellst.

    Stefan

  3. Hallo,

    schnelle einfache Lösung:
    http://typo3.org/extensions/repository/view/convert2utf8/current/

    Rechtsklick auf die Homeseite und dann Convert to UTF8

    ;)

  4. Die genannte Extension wurde allerdings seit 5 Jahren nicht mehr geupdated. Wir sicher läuft sie denn im Zusammenspiel mit aktuellen TYPO3 Versionen? Vor Benutzung auf jeden Fall ein Backup machen…

    Der Ansatz ist halt auch ausschließlich für TYPO3 brauchbar und nicht für Benutzer, die allgemein eine DB auf utf-8 umschalten wollen. Es gibt auch Tools von verschiedenen Anbietern, einen ggf. bestehenden “Zeichensalat” bereinigen können.

  5. Hallo Stefan,
    ich bin heute auf deinen Artikel gestoßen. Sehr ausführlich beschrieben. Ich wollte noch was zu der Extension “Convert to UTF8″ anmerken. Ich habe diese vor einigen Wochen bei einem 4.3 Projekt benutzt. Obwohl die Extension schon etwas älter ist, hat es denoch funktioniert. Da ich es bisher nur 1 mal bei einer alten TYPO3-Installation benötigt habe, kann ich aber nicht sagen ob es immer klappt ;-)
    Grüsse, Michael

  6. Manuelles Suchen und Ersetzen?

    Ich empfehle eine der 5 Möglichkeiten unter
    http://wiki.typo3.org/UTF-8_support#Convert_an_already_existing_database_to_UTF-8

  7. Ich wollte die Extension convert2utf8 verwenden, musste aber leider feststellen, dass diese nur bis TYPO3 4.3 funktioniert. Da sich mit 4.4 das Kontextmenü im Seitenbaum grundlegend geändert hat, wird der “Convert to UTF-8″-Eintrag nicht mehr angezeigt. Schade. Muss man wohl doch den umständlichen Weg per Dump gehen.

Schreibe einen Kommentar