Thu, Jul 24th, 2008
Zend_DB访问MySQL时使用UTF-8编码的问题
最近要在项目中使用Zend_DB作为数据库访问层,虽然方便,不过发现其对UTF-8无法默认就能很好的支持(不过其实更可能是因为mysql默认输出不是utf-8而导致这个问题)
大概的解决方法就是这样:
$db->query("set names utf8")
显然,这样显得不够优雅(也可以说是心理问题 -_-b),每次都必须要手动的进行一次query。
于是更好的方案其实也就是让这个查询成为PDO的初始化查询,方法如下:
1 2 3 4 5 6 7 8 9 10 11 | $db=Zend_Db::factory('PDO_MYSQL', array( 'host' => 'localhost', 'username' => 'your_username', 'password' => 'your_password', 'dbname' => 'your_database', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8' ) ) ); |
还有一个方法也很好,就是重写Zend_Db的factory方法:
1 2 3 4 5 6 7 8 9 10 | class My_Db extends Zend_Db { static public function factory($adapterName, $config = array()) { $adapter = parent::factory($adapterName, $config); $adapter->query('set names utf8'); return $adapter; } } |
以后就可以通过My_Db的factory方法来创建数据库连接了。
另外还有一个方法,就是也可以修改Zend_Db的Zend_Db_Adapter_Pdo_Abstract(位于Zend/Db/Adaptor/Pdo/abstract.php)的_connect方法,在里面添加:
$this->query("set names utf8")
不过这样影响到移植性,所以不推荐……