我在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它不应该。
我做错了吗?
修改
我尝试使用charset=utf-8
和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 |
+-------+--------------+-----------------+
答案 0 :(得分:1)
您可以在连接字符串中使用它:
mysql:host=$host;dbname=$db;charset=utf8"
但是,在PHP 5.3.6之前,charset选项被忽略了。如果您运行的是旧版本的PHP,则必须执行以下操作:
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh->exec("set names utf8");
参考:PHP PDO: charset, set names?
或者,如果你想要,你可以这样做:
<?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);
?>