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")

不过这样影响到移植性,所以不推荐……