首页 > 解决方案 > MySQL PDO dbname 在 MySQL 升级后停止工作

问题描述

我正在使用 PHP 和 PDO 连接到运行 MySQL 的远程 RDS 实例。以前它运行的是 MySQL 5.7。我将它升级到 MySQL 8.0.15。在我这样做之后,我编写的所有没有明确模式名称的 PHP 代码都停止了工作。

作为参考,我使用dbname指向有效模式的属性连接到 pdo。我也完成use schema_name;了我升级的数据库。

以下是使用 PDO 进行连接的代码:

$database = new PDO('mysql:host=<HOST>;dbname=cool;charset=<CHARSET>, <USERNAME>, <PASSWORD>);

groups现在,如果我有一个在我的模式中命名的表cool,我执行以下代码:

$sql = 'SELECT * FROM groups';
$sth = $database->prepare($sql);
$sth->execute();

我以前在 MySQL 5.7 中没有任何问题,并且可以执行此代码。但是,在 RDS 升级后,我收到以下错误:

警告:PDOStatement::execute(): SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“组”附近使用的正确语法...

并且查询本身失败。但是,如果我将代码更改为以下内容:

$sql = 'SELECT * FROM cool.groups';
$sth = $database->prepare($sql);
$sth->execute();

我没有收到任何错误,并且在获取它时会返回所有内容。我一直在与 AWS 支持人员交谈,他们向我保证他们没有任何问题,并且尽管升级中没有保留一些设置(即数据库名称是随机更改的),但没有问题。

PDO 有问题吗?此次升级后,任何未明确指定模式的查询都会中断,这是一个巨大的遗留代码库,这是一个主要问题。我们也不能回到我们的旧 MySQL 版本。

标签: phpmysqlpdo

解决方案


groups是 v8.0.2 中的保留字。更改字段名称或通过反引号将其封装:

`groups`

推荐阅读