【发布时间】:2013-11-10 13:04:51
【问题描述】:
我正在 Lubuntu 12.04、Apache、PHP 5.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。如果我评论SET NAMES utf8 查询,我会得到44656d6f737472616369f36e(区别是c3b3 而不是f3)。
从 MySQL 客户端,当发出 SELECT HEX(name) FROM test_table limit 1; 时,我得到 44656D6F737472616369C3B36E。
所以似乎需要额外的查询,但根据this 它不应该。
我做错了吗?
编辑
我对@987654331@ 和charset=utf8 都进行了尝试,得到了相同的结果。
SHOW CREATE TABLE test_table 的输出:
CREATE TABLE `test_table` (
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW FULL COLUMNS FROM test_table的相关输出:
+-------+--------------+-----------------+
| Field | Type | Collation |
+-------+--------------+-----------------+
| name | varchar(255) | utf8_general_ci |
+-------+--------------+-----------------+
【问题讨论】:
-
不应该只是
charset=utf8吗? -
test_table和name字段的排序规则/字符集是什么?show create table test_table会表明这一点。 -
@raina77ow 我都试过了,但我得到了同样的错误结果
-
在 my.cnf 中设置了
skip-character-set-client-handshake吗?如果有,character-set-server的值是多少? -
@Anthony
character-set-server = utf8,但未设置skip-character-set-client-handshake。我无法检查实际值,因为它没有显示在show variables。