UTF-8 bei externer Datenbank mit DBAL
| Autor | Nachricht |
|---|---|
|
Verfasst am: 09. 02. 2010 [00:23]
|
|
|
maxB
Themenersteller
Dabei seit: 02.01.2006
Beiträge: 49
|
Guten Abend an alle Leserinnen und Leser! nachdem ich TYPO3.net schon so einiges abgewinnen konnte, möchte ich heute ein scheinbar recht spezielles Problem erläutern, zu dem ich bislang keinerlei Informationen auftun konnte. Es geht um folgendes: Ich habe ein kleine eigene Extension programmiert, die im Backend über lediglich ein Dropdown-Feld einen Fahrzeug-Hersteller (Audi, BMW, Ford, Volkswagen etc.) auswählen lässt. Nach der Auswahl soll im Frontend dann die Ausgabe der zugehörigen Modelle mit ein paar zusätlichen Information aus derselben Datenbank erfolgen. Diese ganzen Informationen liegen in einer DB außerhalb von TYPO3. Das soll - wenn möglich - auch so bleiben. Ich realisiere das über den DBAL und konfiguriere die externe Datenbank in der ext_localhonf.php meiner Extension wie folgt: PHP $TYPO3_CONF_VARS['EXTCONF']['dbal']['handlerCfg'] = array (
'_DEFAULT' => array (
'type' => 'native',
'config' => array(
'username' => '', // Set by default (overridden)
'password' => '', // Set by default (overridden)
'host' => '', // Set by default (overridden)
'database' => '', // Set by default (overridden)
)
),
'alternativeMySQLdb' => array (
'type' => 'native',
'config' => array(
'username' => 'testuser',
'password' => 'testpw',
'host' => 'localhost',
'database' => 'testdb',
)
),
);
$TYPO3_CONF_VARS['EXTCONF']['dbal']['table2handlerKeys'] = array (
'einefremdedb' => 'alternativeMySQLdb',
'zweitefremdedb' => 'alternativeMySQLdb',
);Das jedoch nur als Einleitung zum Verständnis. Diese Datenbank enthält - neben den Modellbezeichnungen - eben auch einiges an weiteren Informationen als Fließtext. Fließtext bedeutet in diesem Fall, dass auch Umlaute und Sonderzeichen enthalten sind. Die Daten werden täglich aus einer Oracle-Datenbank ex- und per Bash-Script in eine MySQL-Datenbank importiert. Nun habe ich TYPO3 auf UTF-8 "umgestellt". Sämtliche Queries werden in UTF-8 abgehalten, das läuft alles sauber. Wenn ich nun jedoch aus meiner eigenen Datenbank mit den diversen Informationen Text per exec_SELECTquery auslese und anschließend ausgebe, werden Umlaute/Sonderzeichen nicht korrekt dargestellt. Wenn ich die betroffene Datenbank hingegen aus dem DBAL herausnehme und in die TYPO3-Datenbank importiere, funktioniert die Ausgabe von Sonderzeichen einwandfrei. Beide Datenbanken (TYPO3 und extern) und die betroffenen Spalten/Felder sind utf8_general_ci kodiert - ich habe zuvor diverse Konstellationen bzgl. der Kollation getestet. Nichts hat mich meinem Ziel näher gebracht. Ich hoffe nun darauf, dass irgendjemand hier im Forum etwas zu diesem Thema beitragen kann. Vor allem aus Interesse und Ehrgeiz heraus. Meine Mittel und Ideen sind am Ende. Ich hätte höchstens Alternativen in der Tasche, die mich langfristig aber innerlich wurmen würden. Ich bitte daher um zahlreiche Ideen! Max |
|
Verfasst am: 10. 06. 2010 [08:58]
|
|
|
aguen
Dabei seit: 16.06.2006
Beiträge: 23
|
Hallo, ich kann (leider) dieses Problem nur bestaeitgen. Habe bisher auch keine (gute) Loesung gefunden. Ich greife aus einer typo3 Installation (A) auf eine Tabelle in einer anderen typo3 Installation (B) zu (A und B verwenden unterschiedlieche Datenbanken auf dem selben Server, sind aber ansonsten weigehend gleich, also gleiche typo3 Version 4.3.2 etc.). Die Resulate werden offenbar nicht in utf8, sondern latin1 geliefert. "SET NAMES utf8" ist konfiguriert. Beim Zugriff auf die Tabelle innerhalb der typo3 Version B ist alles korrekt ( utf8 ). Beim Zugriff auf die Tabelle von B in der typo3 Version A mit DBAL stimmen die Umlaute nicht. Importiere ich die Tabelle aus B nach A ist wieder alles in Ordnung. Dasselbe Problem auch, wenn ich aus B auf eine Tabelle in A zugreifen will. Waere ebenfalls an einer Loesung interessiert. Gruss, Armin |
|
Verfasst am: 10. 06. 2010 [15:37]
|
|
|
aguen
Dabei seit: 16.06.2006
Beiträge: 23
|
So, jetzt habe ich eine Loesung gefunden bzw. das Problem lokalisiert (glaube ich)! Um eine typo3 Installation fuer utf-8 zu konfigurieren ist in der Regel folgende Variable zu setzen (Installation): $TYPO3_CONF_VARS['SYS']['setDBinit'] = 'SET NAMES utf8;'; Diese Konfiguration sollte eigenentlich - zumindest bei MySQL Datenbanken - auch an eine via DBAL angesprochene alternative Datenbank weitergegeben werden. Wird sie aber nicht! Das hat zur Folge, dass die Verbindung zur altenativen Datenbank eben nicht UTF-8 verwendet. Folgende Modifikation von DBAL hat fuer mich das Problem geloest: In /typo3/sysext/dbal/class.ux_t3lib_db.php in der Funktion function handler_init($handlerKey): PHP $setDBinit = t3lib_div::trimExplode(chr(10), $GLOBALS['TYPO3_CONF_VARS']['SYS']['setDBinit'], 1);
foreach ($setDBinit as $v) { if (mysql_query($v, $this->link) === FALSE) {...}aendern in PHP $setDBinit = t3lib_div::trimExplode(chr(10), $GLOBALS['TYPO3_CONF_VARS']['SYS']['setDBinit'], 1);
foreach ($setDBinit as $v) { if (mysql_query($v, $link) === FALSE) {...}Also "$link" statt "$this->link". Dann wird die "SET NAMES utf8;" Anweisung auch korrekt an die alternative Datenbankverbindung (in der Konfiguration von MaxB ist das "alternativeMySQLdb" ) weitergegeben. Ich habe allerdings diese Modifikation bisher nicht auf eventuelle Nebeneffekte geprueft. Siehe auch http://bugs.typo3.org/view.php?id=13431 [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 10.06.2010 um 15:38.] |



