【问题标题】:Server sent charset (255) unknown to client, but the character sets match服务器向客户端发送未知字符集 (255),但字符集匹配
【发布时间】:2019-10-01 00:39:24
【问题描述】:

我正在尝试通过 PHP 和 MySQL 访问 localhost 数据库。每次尝试时,我都会收到错误消息:Warning: PDO::__construct(): Server sent charset (255) unknown to the client. 在错误消息中,我看到我正在调用: PDO->__construct('mysql:host=localhost;dbname=db;charset=utf8mb4', 'noah', 'mypassword'). 到目前为止,我查找的所有内容都告诉我,问题在于我的调用和数据库之间的字符集不匹配。但是,当我通过mysql -u noah -p 登录 MySQL 时,执行USE db 然后SELECT @@character_set_database, @@collation_database; 我看到了:

+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_unicode_ci   |
+--------------------------+----------------------+

所以他们正在使用相同的字符集,我真的不知道为什么查询不起作用。更奇怪的是,当我更改调用构造函数的数据库用户或密码时,我得到了同样的错误。我希望它会给我一个关于错误登录凭据的不同错误。但是如果我更改了 dsn,它确实给了我一个关于它如何找不到数据库的不同错误。

我正在使用 MySQL 8.0.17 并通过带有谷歌应用引擎的本地开发服务器运行代码。该开发服务器正在运行 PHP 5.5.26

编辑:这是问题根源的一些实际代码:

$app['db'] = function (Container $c) {
    $pdo = new ExtendedPDO(
        $c['service.config']->get('db.dsn'),
        $c['service.config']->get('db.user'),
        $c['service.config']->get('db.password')
    );

Container 是一个Pimple 容器。应用程序是Silex 应用程序。 ExtendedPDO 只是一个以此处不重要的方式扩展 PDO 的类(它只是在调用父函数时跟踪查询计数)。所有 db 字段都是从 env_dev.yaml 文件中获取的,我知道这是真的,因为当我在那里更改它们时,它会更改错误消息的输出。错误消息可以追溯到上面发布的代码块的最后一行,因为在尝试创建 PDO 对象时它会释放异常。

【问题讨论】:

  • 能否请您出示您的实际代码,即$someVar = new PDO(...
  • 另外,您确定您使用的是 PHP 7.3 吗?您的脚本是通过 CLI 还是 Web 服务器(例如 php-fpm)运行的?如果是后者,通常会发现您拥有多个 PHP 副本并且您的 Web 服务器运行的是旧版本。
  • @Phil 我很确定我对 PHP 的版本是正确的。我正在通过 CLI 运行我的脚本,并确保更新我的 $path 以便它使用最新版本。但是,我今天早些时候确实注意到我安装了两个版本的 PHP(如果我不告诉它,我认为它不会使用旧版本)所以我会尝试完全删除旧版本,看看是否解决它。
  • @Phil 我还添加了一点代码上下文。如果你愿意,我可以尝试提供更多,但我继承的这个代码库有点迷宫。
  • 要运行和构建我使用谷歌应用引擎的应用程序,并使用谷歌云 sdk 提供的dev_appserver.py 脚本运行本地开发服务器。当我运行 php - v 时,它显示 7.3.8 (cli)。但它看起来像在我的 composer.json 中,它将 config.platform php 版本设置为 5.6。所以这似乎很可能是问题所在。有没有办法在 php 5.6 中解决这个问题?还是我只需要更新?我担心如果我升级我会破坏项目中的其他东西,但如果我必须更新我会的。

标签: php mysql


【解决方案1】:

想通了。无论我做什么,PHP 5.0 似乎都无法读取 MySQL 8.0 的响应。就我而言,我卸载了 MySQL 并重新安装了 5.7.27 版本,现在它可以正常工作了。

非常感谢 Phil 帮我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 2018-12-05
    • 2017-06-25
    相关资源
    最近更新 更多