【问题标题】:PDO MySQL dsn charset not workingPDO MySQL dsn 字符集不起作用
【发布时间】: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 它不应该。

我做错了吗?

编辑

我对@9​​87654331@ 和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_tablename 字段的排序规则/字符集是什么? 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

标签: php mysql pdo


【解决方案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: 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);

【讨论】:

  • 他在问题中提到了PHP的版本。
  • 答案不仅适用于 OP。此答案可能对使用旧版本 PHP 的用户有所帮助。
  • 是的,它帮助我意识到我们使用的是 5.3.3 而不是 5.3.6!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2013-05-23
相关资源
最近更新 更多