我正在使用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版本。