最近要在项目中使用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")
不过这样影响到移植性,所以不推荐……