0

我正在 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.

所以似乎需要额外的查询,但据此不应该。

难道我做错了什么?

编辑

我尝试了charset=utf-8andcharset=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 |
+-------+--------------+-----------------+
4

1 回答 1

1

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

"mysql:host=$host;dbname=$db;charset=utf8"

然而,在 PHP 5.3.6 之前,字符集选项被忽略了。如果你运行的是旧版本的 PHP,你必须这样做:

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

参考:PHP PDO:字符集,设置名称?

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

<?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);
于 2013-10-30T18:37:17.733 回答