Hallo Raphael,

Die Datenbank (MySQL 5)ist komplett auf utf8 eingestellt (character_set_client, character_set_connection, character_set_database) und im Installtool steht '[BE][forceCharset] = utf-8' aktiviert.

Das ist richtig. Entscheidend ist m. W. nicht nur die Kollation der Datenbank sondern auch die Kollation der Datenbankverbindung. Standardmäßig ist die Kollation der Datenbankverbindung eben nicht automatisch UTF-8, sondern erst dann, wenn man diese mit set names utf-8 erzwingt. Das ist kein Problem von TYOPO3 sondern ein Problem von PHP und MySQL und wird erst seit MySQL 5 wirklich zum Problem. Deshalb wurde in den Versionen von TYPO3 > 4.0 auch die Option set names eingeführt.

Das ganze wird noch dadurch kompliziert, dass nicht nur beim Schreiben durch TYPO3 die Kollation der DB-Verbindung beachtet werden muss, sondern auch beim Erstellen des Dump. Wenn du den Export z. B. mit einer neuen Version von phpMyAdmin vornimmst, so wird per Default der Dump mit set names utf-8 erstellt, was MySQL veranlasst, UTF-8-Dateien zu liefern. Heisst, der Dump von phpMyAdmin ist in jedem Fall UTF-8, ausser du stellst die Datenbankverbindung in phpMyAdmin absichtlich um auf latin.

Mit anderen Worten: MySQL konvertiert selbstständig die Daten, die es bekommt und liefert, und zwar abhängig von der Kollation der Datenbankverbindung.

Was mich jetzt allerdings brennend interessiert:
a) wie werden die Eingaben aus dem Backend tatsächlich kodiert, wenn forceCharset auf utf-8 gesetzt ist und setDBinit keine Anweisung enthält?

Das hängt m. W. von der Konfiguration von MySQL und/oder PHP ab, kann also auf jedem System anders aussehen. Aber m. W. werden in der Regel dann utf-8 Daten über eine latin-DB-Verbindung gesendet, was dazu führt, dass in der DB die utf-8-Zeichen in latin gespeichert werden. Das kann man schön sehen, wenn man mit phpMyAdmin drauf geht und dort fehlerhafte Zeichen sieht, während TYPO3 korrektes utf-8 ausliefert.

Nachdem ich nach zahlreichen Tests definitiv ausschliessen kann, dass der Dump fehlerhaft ist, konnte ich den Verursacher mittlerweile auf TYPO3 eingrenzen.


Ist er das? Welchen Zeichensatz hast du im Dump tatsächlich? Öffnen mit einem Texteditor und nachschauen ist die einzige Möglichkeit das rauszufinden. Je nachdem, mit welcher Datenbankverbindung du den Dump erstellst, erhältst du Latin oder utf-8 im Dump, und zwar unabhängig davon, welche Daten in der Datenbank drin sind ... Auf der sicheren Seite ist man dann, wenn man bei _jeder_ Datenbankverbindung set names = utf8 verwendet, also auch dann, wenn der Dump erstellt und wieder eingespielt wird. Wenn du in einen Dump von phpMyAdmin reinschaust, wirst du ganz oben entsprechende Komentarzeilen finden, die die DB- Verbindung einstellen:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

b) wie kann ich die verwurstete Datenbank wieder in korrektes UTF-8 zurückcodieren?

Normalerweise kein allzugroßes Problem, allerdings nur wenn die Daten nicht gemischt wurden - also wenn TYPO3 z. B. eine Zeit lang mit und ohne set names gearbeitet hat. Es gibt ja nur zwei Möglichkeiten: der Dump ist in utf-8 oder er ist in latin. Ensprechend kann man vorgehen:

- dump in utf-8:
Beim Zurückspielen in die DB darauf achten, dass die Verbindung auf set names = utf-8 steht. Danach in TYPO3 die beiden Einstellungen von oben vornehmen, dann müsste es klappen. So habe ich schon eine ganze Reihe von Installation von Latin auf utf-8 rübergezogen.

- dump in latin:
Konvertieren in utf-8 und dann wie oben.

Achtung: ein Problem waren bei mir Umlaute in den TypoScript- Templates, die leider dazu geführt haben, dass ab den Umlauten das restliche TypoScript gefehlt hat. Warum weiss ich nicht - bei mir kein großes Problem, da ich das TS eh extern halte. Wenn es jemand weiss, warum das passiert - bitte posten :-)


Bin für jeden Vorschlag dankbar, da ich schon alleine für den Fall ein funktionierendes Backups meine Datenbanken reparieren muss!

wie gesagt: du musst beim Erstellen und beim Zurückspielen des Dumps auf die korrekte Kollation achten.

Gruß
Peter



_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an