在 Zend_Db 中使用 UTF-8 编码
基本思路就是向数据库发送 SQL “SET NAMES UTF8″,可根据不同的情况来编写代码。
如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php $params = array ( 'host' => '127.0.0.1', 'username' => 'verdana', 'password' => '******', 'dbname' => 'phpvim' ); try { $db = Zend_Db::factory('PDO_MYSQL', $params); $db->query("SET NAMES UTF8"); Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Exception $e) { exit($e->getMessage()); } Zend_Registry::set('dbAdapter', $db); /* vim: set expandtab tabstop=4 shiftwidth=4: */ ?> |
这是早期的解决方法,其实并不推荐这么做,因为并不是所有页面都需要 SQL 查询,上述代码放在 bootstrap 中,在不需要 SQL 连接的页面中也会开启一次数据库连接并发送 SET NAMES UTF8 ,这就浪费了资源。
如果你使用 PDO_MYSQL 的话,可以为 PDO::MYSQL_ATTR_INIT_COMMAND 指定一条 SQL,这条 SQL 的优先级最高,它会在任何其它的 SQL 之前运行,我们可以把 SET NAMES UTF8 放在这里,当没有其它查询时,这条 SQL 是不会被执行的,这就避免了上面提到的浪费资源的情况,那么上述代码可以改成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php $params = array ( 'host' => '127.0.0.1', 'username' => 'verdana', 'password' => '******', 'dbname' => 'phpvim', 'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8') ); try { $db = Zend_Db::factory('PDO_MYSQL', $params); Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Exception $e) { exit($e->getMessage()); } Zend_Registry::set('dbAdapter', $db); /* vim: set expandtab tabstop=4 shiftwidth=4: */ ?> |
很多人都喜欢把数据库的连接参数丢在配置文件中,比如放在 INI/XML 文件中,再由 Zend_Config 载入。
其实 PDO::MYSQL_ATTR_INIT_COMMAND 也可以放在配置文件中的。
1 2 3 4 5 6 7 | [production] database.adapter = "PDO_MYSQL" database.params.dbname = "phpvim_db" database.params.host = "localhost" database.params.username = "verdana" database.params.password = "******" database.params.driver_options.1002 = "SET NAMES utf8" |