【发布时间】: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 中解决这个问题?还是我只需要更新?我担心如果我升级我会破坏项目中的其他东西,但如果我必须更新我会的。