当我使用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的字符集部分被解析了,但我看不到它在任何地方被使用......
那么,我在这里做错了吗?感谢。
答案 0 :(得分:4)
您应该使用完全关联数组中的连接传递charset:http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#pdo-mysql
在构建连接后使用SET NAMES设置字符集是错误的。这将导致mysqli real_escape不正确地转义字符。