Php PDO MySQL dsn字符集不工作

Php PDO MySQL dsn字符集不工作,php,mysql,pdo,Php,Mysql,Pdo,我正在Lubuntu 12.04、Apache、PHP5.5.3-1ubuntu2、pdo_mysql 5.5.32和mysql 5.5.32-0ubuntu7-log上尝试以下代码 $dbh = new \PDO("mysql:host=$hostname;dbname=test_db;charset=utf-8", $username, $password); $dbh->exec('SET NAMES utf8'); $sql = "SELECT name FROM test_t

我正在Lubuntu 12.04、Apache、PHP5.5.3-1ubuntu2、pdo_mysql 5.5.32和mysql 5.5.32-0ubuntu7-log上尝试以下代码

$dbh = new \PDO("mysql:host=$hostname;dbname=test_db;charset=utf-8", $username, $password);

$dbh->exec('SET NAMES utf8');

$sql = "SELECT name FROM test_table";
foreach ($dbh->query($sql) as $row) {
    error_log(bin2hex($row['name']));
}
我得到了
44656d6f737472616369c3b36e
。如果我对
集合名称utf8
查询进行注释,我会得到
44656d6f737472616369f36e
(区别是
c3b3
而不是
f3

从MySQL客户端发出
时,从test_table limit 1中选择十六进制(name)我得到了
44656D6F737472616369C3B36E

因此,似乎需要额外的查询,但根据调查,不应该这样做

我做错什么了吗

编辑

我用
charset=utf-8
charset=utf8
尝试了这两种方法,得到了相同的结果

SHOW CREATE TABLE test\u TABLE
的输出:

CREATE TABLE `test_table` (
    `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
相关产出:


您将在连接字符串中包含它,如:

"mysql:host=$host;dbname=$db;charset=utf8"
但是,在PHP5.3.6之前,字符集选项被忽略。如果您运行的是旧版本的PHP,则必须按照以下方式执行:

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");
参考:

或者,如果您愿意,您可以这样做:

<?php

$dsn = 'mysql:host=localhost;dbname=testdb';

$username = 'username';
$password = 'password';

$options = array(
  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn, $username, $password, $options);

不应该是
charset=utf8
吗?
test\u表和
name
字段上的排序规则/字符集是什么
show create table test\u table
会显示这一点。@raina77现在我尝试了这两种方法,但在my.cnf is
skip character set client handshake
set中得到了相同的错误结果?如果是,什么是
字符集服务器
值?@Anthony
字符集服务器=utf8
,但未设置
跳过字符集客户端握手
。我无法检查实际值,因为它没有显示在
show variables
上。他在问题中提到了PHP的版本。答案不仅仅针对OP。这个答案可能会帮助用户使用旧版本的PHP。是的,它帮助我意识到我们使用的是5.3.3而不是5.3.6!
<?php

$dsn = 'mysql:host=localhost;dbname=testdb';

$username = 'username';
$password = 'password';

$options = array(
  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn, $username, $password, $options);