Как я могу установить mysql charset во время соединения, используя доктрину? - PullRequest
2 голосов
/ 20 апреля 2011

Я пытаюсь установить кодировку в utf8 при подключении к базе данных с помощью Doctrine. Я могу сделать это нормально, если я подключаюсь с помощью обычного соединения PDO, как это:

$manager = Doctrine_Manager::getInstance();

$manager->connection(
    array(
        'mysql:dbname=mydb;host=127.0.0.1;',
        'user',
        'password',
        array( PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';" )
        ),
    'doctrine' );

Проблема, с которой я столкнулся, заключается в том, что я не могу удалить базу данных, если не использую dsn, подобный Doctrine. Примерно так:

$manager->connection('mysql://user:password@127.0.0.1/mydb', 'doctrine' );

Но, если я делаю это так, я не могу установить атрибуты PDO с самого начала (во время соединения), я должен использовать:

$manager->getConnection( 'viajeros_doctrine' )->setCharset('utf8');
$manager->getConnection( 'viajeros_doctrine' )->setAttribute(Doctrine_Core::ATTR_PERSISTENT, true);

Теперь я не уверен, что это хуже с точки зрения производительности (я имею в виду, я не знаю точно, что PDO делает с его параметрами, когда вы создаете новый объект, но я думаю, что я выдаю бесполезный запрос каждый раз, когда я подключаюсь к базе данных (SET NAMES='UTF8').

Из того, что я прочитал на http://www.doctrine -project.org / Документация / Руководство / 1_1 / ru / Введение в соединения , я должен использовать что-то вроде:

$manager->connection('mysql://user:password@127.0.0.1/mydb?charset=utf8', 'doctrine' );

Но, просматривая код Doctrine с помощью отладчика, я вижу, что часть кодировки dsn анализируется, но я не вижу, чтобы она использовалась где-либо ...

Так, я что-то здесь не так делаю? Спасибо.

1 Ответ

4 голосов
/ 09 сентября 2012

Вы должны передать кодировку с соединением в полностью связанный массив: http://docs.doctrine -project.org / projects / doctrine-dbal / en / latest / reference / configuration.html # pdo-mysql

Неправильная настройка кодировки с помощью SET NAMES после установления соединения. Это приведет к тому, что mysqli real_escape неправильно экранирует символы.

Он будет проанализирован как ассоциированный массив: http://www.tig12.net/downloads/apidocs/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Manager.php.source.html#line221

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...