如何使用doctrine在连接时设置mysql字符集?

如何使用doctrine在连接时设置mysql字符集?,mysql,doctrine,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_PERSI

当我使用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' );
$manager->connection('mysql://user:password@127.0.0.1/mydb', 'doctrine' );
我的问题是,除非我使用dsn这样的原则,否则我不能删除数据库。大概是这样的:

$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' );
$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'

根据我在上所读到的,我应该使用以下内容:

$manager->connection('mysql://user:password@127.0.0.1/mydb?charset=utf8', 'doctrine' );
但是,通过使用调试器查看条令代码,我看到dsn的字符集部分得到了解析,但我看不到它在任何地方被使用


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

您应该在完全关联的数组中传递带有连接的字符集:

在建立连接后使用集合名称设置字符集是错误的。这将导致mysqli real\u escape错误地转义字符


它将被解析为一个assoc数组:

我想我已经回答了我自己的问题。在仔细阅读之后,我发现MySQL PDO忽略了它的dsn中的字符集规范,因此,设置它的方法是通过
set NAMES
查询,这是我在第一个连接示例中使用的,使用PDO::MySQL_ATTR_INIT_命令。谢谢