Лучший способ установить кодировку для Zend_Db (или, по крайней мере, лучше, чем то, что я сейчас делаю)

Я использую Zend_DB и пытаюсь изменить charset на utf8, вот код:

config.ini:

[development]
db.host = "localhost"
db.username = "root"
db.password = "toor"
db.dbname = "db_whoopdiedo"
db.charset = "utf8"

bootstrap.php:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initAutoload() 
    {
        Zend_Registry::set(
            'config',
            new Zend_Config_Ini(APPLICATION_PATH.'/configs/config.ini', 'development')
        );

        Zend_Registry::set(
            'db',
            Zend_Db::factory('Pdo_Mysql', Zend_Registry::get('config')->db)
        );

        Zend_Registry::get('db')->setFetchMode(Zend_Db::FETCH_OBJ);
        Zend_Registry::get('db')->query("SET NAMES 'utf8'");
        Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");
   }
}

Я думал, что будет достаточно добавить кодировку в config, но он применит ее только в том случае, если я установил ее напрямую, используя:

Zend_Registry::get('db')->query("SET NAMES 'utf8'");
Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");

Мой вопрос: есть ли лучший способ установить кодировку, может быть, config wise?

Ответ 1

Во-первых, я вырвал настройку базы данных в свою собственную функцию init так:

/**
 * Initiate Zend Autoloader  
 * @return Zend_Db_Adapter 
 */
protected function _initDatabase() 
{
    $resource = $this->getPluginResource('db');
    $db = $resource->getDbAdapter();
    Zend_Registry::set("db", $db);
    return $db;
}

В приведенном выше примере используются ресурсы, которые являются предопределенными конфигурационными структурами для определенных общих задач в Zend Framework. Просто имея следующее в моем файле конфигурации application.ini, мы можем обратиться к ресурсу 'db' в Bootstrap выше:

resources.db.adapter = "pdo_sqlite"
resources.db.params.host = "localhost"
resources.db.params.username = "databaseuser"
resources.db.params.password = "mysecretpassword"
resources.db.params.dbname = APPLICATION_PATH "/data/db/ccymod.db"
resources.db.isDefaultTableAdapter = true

Этот пример предназначен для sqlite db, но MySQL будет похож, но с pdo_mysql и dbname не будет путь к файлу, а строка.

Дополнительную документацию по ресурсам можно найти здесь:

http://framework.zend.com/manual/en/zend.application.available-resources.html

Теперь, используя раздел конфигурации ресурсов, мы можем добавить к нему следующие строки, чтобы установить набор символов базы данных следующим образом:

resources.db.params.charset = "utf8"
resources.db.params.driver_options.1002 = "SET NAMES utf8;"

Если у вас все еще есть проблемы, взгляните на блог блога Rob Allen zend Framework, посвященный akrabat dot com, и комментарии, связанные с номером 45 и последующие настройки UTF8 и mysql для ресурсов ZF.

Ответ 2

Взято из нашего приложения .ini:

db.params.driver_options.3 = "SET NAMES 'utf8'"