2009-02-25 50 views

回答

46

Itay,

一个很好的问题。幸运的是,答案很简单:

database.params.driver_options.1002 = "SET NAMES utf8" 

1002是恒定的PDO的价值:: MYSQL_ATTR_INIT_COMMAND

你不能在Zend_Db的获取config.ini

118

担心我google-fu

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db', 
    "username", 
    "password", 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

第一击;)

+1

:-)我的google foo比较好,在发布之前发现这个,应该有这样的说法。 我会优化我的问题,我想在config.ini中做,而不是在php代码中。 – 2009-02-25 13:21:47

+1

在那个常量中斜线逃脱的是什么? – Kzqai 2012-08-01 16:02:19

0

在引导文件...

$db = Zend_Db::factory($adapter, $config); 
$db->query("SET NAMES 'utf8'"); 

然后保存这种情况下您的注册表

Zend_Registry::set('db', $db); 
4

连接使用常量这意味着它在第一个查询上连接。 如果你有一个没有查询的静态页面,它甚至不会连接 - 即使它在你的引导文件中被初始化。

这样运行:

$db->query("SET NAMES 'utf8'"); 

是没有那么聪明。 非常感谢他的解决方案dcaunt。

32

只是把这个在你的配置

database.params.charset = "utf8" 

或ZF 1.11在此之后将努力 resources.db.params.charset = utf8 就是它

-1
$table->getAdapter()->query('SET NAMES UTF8'); 
3

所有这些方法768,16工作,除了一些特殊情况。例如,如果你正在一台windows计算机上本地运行一个web服务器,使用php < 5.3.1,只有'manual'$ db-> query(“SET NAMES'utf8'”);在您的实际查询将工作之前。 任何其他尝试使用MYSQL_ATTR_INIT_COMMAND的方法都会失败。

这是我今天了解到,随着这个非常艰难的问题:

  1. 你不能指在某些环境PDO :: MYSQL_ATTR_INIT_COMMAND(即我的,具体我不知道)。你必须明确地使用1002代替

  2. 使用Zend Framework 1.11(可能从1.8版本开始,待确认),你不需要在配置文件中设置database.params.driver_options.1002 =“SET NAMES utf8”。 ini:resources.db.params.charset =“utf8”将足以让Zend_Db_Adapter_Pdo_Mysql为您做到这一点。

  3. 在windows上,您需要php> = 5.3.1才能使MYSQL_ATTR_INIT_COMMAND正常工作。

  4. 如果你用5.3.1或更高版本替换你的php版本(我也测试过5.3.3),你需要确保你的php.ini文件中的值设置为pdo_mysql.default_socket。默认的空值将不起作用(待确认:我读了一些关于此的内容,但在找出第5点后没有尝试没有它)

  5. 您还需要确保您有'127.0。 0.1本地主机”在您的WINDOWS \ SYSTEM32 \ DRIVERS \等\主机隐藏的系统文件(这是不是PHP 5.3.0有问题)

有了这一切记住,你应该能够从保存你自己一天搜索并保留你的头发! ;)

相关问题