Discussion:
Doctrine UTF-8/Zeichensatz Problem
(zu alt für eine Antwort)
Andre Schmidt
2009-11-10 07:39:58 UTC
Permalink
Hallo in die Runde,

nachdem mich nach langem Hin-und Her nun doch Doctrine überzeugt hat,
bin ich gerade dabei einige "Kernanwendungen" auf die Nutzung von
Doctrine zu überführen.

Es muss also im Moment so sein, dass ich Doctrine parallel zu meiner
alten Datenbanklösung verwende.

Aber mein Problem ist eigentlich ein ganz anderes:
Doctrine speichert innerhalb der Datenbank nicht in UTF-8!

Dabei ist die Nutzung von UTF-8 ei mir seit langer Zeit so:
Apache2 auf UTF8
MySQL auf UTF8

Und da ich nun die Schemen(.yml) Dateien erstelle, achte ich darauf,
dass bei jeder Tabelle auch brav ein

  options:
    type: INNODB
    collate: utf8_unicode_ci
    charset: utf8

steht.

Nur leider hilft das nicht.

Alle Werte, die ich noch prüfen kann, geben mir ein "UTF-8" als
Kodierung heraus (mb_endcoding_detect()).

Die Prüfung jedoch über PHPMyAdmin offenbart mir die entsprechende
Umlauteproblematik. (Webbrowser ist auf UTF8 eingestellt).

Welche Encodierung ich dort eigentlich finde, weiss ich nicht. Latin-1
ist es auch nicht.

Im Prinzip auch fast kein Problem, wenn nicht meine alten
Datenbankanwendungen auf die Daten z.T. zugreifen und dann in der
Anwendung das Chaos anzeigen. Doctrine macht wenigstens in beide
Richtungen "Mist", logisch.

Nur:
Wie bekomme ich nun Doctrine dazu, die Daten so in der Datenbank zu
speichern (mit dem richtigen Encoding), dass ich die Daten auch über
PHPMyAdmin lesen kann?

Einige Suche im Netz hat mich nicht unbedingt weiter gebracht,
bzw. funktionierten so nicht.

Danke für Hilfe

Gruß
André
Sam Kang
2009-11-10 10:31:54 UTC
Permalink
Post by Andre Schmidt
Wie bekomme ich nun Doctrine dazu, die Daten so in der Datenbank zu
speichern (mit dem richtigen Encoding), dass ich die Daten auch über
PHPMyAdmin lesen kann?
$conn = Doctrine_Manager::connection('mysql://user:***@localhost/test')
$conn->setCharset(’UTF8′);

Meinst du sowas? Ohne setCharset() geht es nicht.

Sam
--
Fortgeschrittene Inkompetenz ist nicht zu Unterscheiden von Boshaftigkeit.
(J. Porter Clark)
Claus Reibenstein
2009-11-10 11:08:38 UTC
Permalink
Post by Sam Kang
$conn->setCharset(’UTF8′);
^ ^

Wohl eher

$conn->setCharset('UTF8');

Gruß. Claus
Andre Schmidt
2009-11-10 19:02:27 UTC
Permalink
Hallo zurück,
Post by Sam Kang
$conn->setCharset(’UTF8′);
Bei mir steht schon alles im Verbindungsaufbau:

$manager = Doctrine_Manager::getInstance();
$manager->openConnection(DSN, 'doctrine');
$manager->setCharset('utf8');
$manager->setCollate('utf8_general_ci');
$manager->setAttribute('model_loading', 'conservative');

Oder fehlt noch etwas?

Gruß
André
Sam Kang
2009-11-10 22:38:17 UTC
Permalink
Post by Andre Schmidt
$manager = Doctrine_Manager::getInstance();
$manager->openConnection(DSN, 'doctrine');
$manager->setCharset('utf8');
$manager->setCollate('utf8_general_ci');
$manager->setAttribute('model_loading', 'conservative');
Müsste so passen. Ich hatte mal auch so ein Problem mit PHP PDO. Da half nur
ein "SET NAMES utf8 COLLATE utf8_general_ci" um dem Treiber einen Tritt zu
verpassen. Sende das doch mal als "raw" query raus in deiner $manager Instanz

Hier noch ein Thread der sich auch damit befasst.

http://forum.symfony-project.org/index.php/m/82482/

Sam
--
Fortgeschrittene Inkompetenz ist nicht zu Unterscheiden von Boshaftigkeit.
(J. Porter Clark)
Andre Schmidt
2009-11-11 23:35:51 UTC
Permalink
Post by Sam Kang
Müsste so passen. Ich hatte mal auch so ein Problem mit PHP PDO. Da half
nur ein "SET NAMES utf8 COLLATE utf8_general_ci" um dem Treiber einen
Tritt zu verpassen. Sende das doch mal als "raw" query raus in deiner
$manager Instanz
Sorry, ich stehe ein wenig auf dem Schlauch und finde auch nichts nahrhaftes
in der Dokumentation, aber:

Wie übergebe ich einen RAW Query?

Ich habe am Anfang stehen:
$manager = Doctrine_Manager::getInstance();
$manager->openConnection(DSN, 'doctrine');
$manager->setCharset('utf8');
$manager->setCollate('utf8_general_ci');
$manager->setAttribute('model_loading', 'conservative');

Und nun?

In der Doku steht nur was mit "->select()" ...

Was anderes finde ich nicht!

Kurze Hilfe?

Danke und Gruß
André

Loading...