如何在连接时使用doctrine设置mysql charset?

时间:2011-04-20 18:19:19

标签: mysql doctrine

当我使用Doctrine连接到数据库时,我正在尝试将字符集设置为utf8。如果我使用这样的常规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' );

我遇到的问题是我不能删除数据库,除非我使用类似Doctrine的dsn。像这样:

$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/documentation/manual/1_1/en/introduction-to-connections阅读的内容,我应该使用类似的内容:

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

但是通过调试器使用Doctrine代码,我看到dsn的字符集部分被解析了,但我看不到它在任何地方被使用......

那么,我在这里做错了吗?感谢。

1 个答案:

答案 0 :(得分:4)

您应该使用完全关联数组中的连接传递charset: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