php - 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 版本。
解决方案
groups是 v8.0.2 中的保留字。更改字段名称或通过反引号将其封装:
`groups`
推荐阅读
- python - 在 Python 中组合几个函数
- debian - 在 Debian 服务器上运行 Google Lighthouse
- applescript - 当文件夹中存在 PDF 文件时自动运行 Applescript
- node.js - 减少承诺数组,而不是映射和过滤未定义/空值
- containers - 监视基于 Azure Web App Linux 的容器
- android - Jetpack Compose dev06 setContent() 不起作用?
- javascript - 嵌套异步 - 最佳实践
- javascript - 在哪里为 vue.js devtools 设置 devtools = true?
- java - 如何为 CardLayout 添加返回和下一步按钮?
- javascript - VueJS 2 v-for 表单输入单选按钮检查属性不起作用