在 Zend_Db 中使用 UTF-8 编码

Mar 18th, 2009 | Filed under PHP

基本思路就是向数据库发送 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"

😛

Tags: , ,
Comments are closed.