从5.7升级后的MySQL 8 SELECT语句语法问题

时间:2019-09-27 11:40:26

标签: mysql mysql-8.0

我最近开始测试MySQL 8,而不是5.7

基本SQL select语句失败,在5.7及更早版本中可以正常工作。一个这样的例子是:

select * from member;

您的SQL语法有误。...请参阅手册“成员”附近的用法。

但是,如果将查询的表名(在本例中为成员)用反引号引起来,或者如果将数据库名称前缀为表名,并用句点分隔,则该语句运行良好。

select * from `member`select * from mydbname.member都很好。

我想知道的是:

  1. 是否存在一个sql-mode值,或者配置文件设置为一个可以激活/停用此行为?

  2. 用于SELECT和JOIN语法的mysql在线参考示例也是纯标识符,例如SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)。注意,t1没有包含在反引号中,并且数据库也没有前缀。我想念什么吗?

1 个答案:

答案 0 :(得分:1)

当数据库对象名称与MySQL中的某些保留关键字相同时,您需要使用反引号。

就您而言,member实际上是自8.0.17版以来在MySQL中的保留字:

https://dev.mysql.com/doc/refman/8.0/en/keywords.html

  

是否有一个sql-mode值或配置文件设置可以激活/停用此行为?

与Microsoft SQL Server的“兼容性级别”选项会更改查询中的保留字集不同,MySQL的兼容性选项列表不允许您限制保留字:https://makandracards.com/makandra/51169-understanding-sql-compatibility-modes-in-mysql-and-mariadb-我强烈建议您不要使用任何MySQL的兼容模式,因为您真的确实不希望MySQL 4.x或MySQL 5.x的非标准行为(例如ONLY_FULL_GROUP_BY = off)。