MySQL 8.0 新增保留关键字踩坑
背景
许多产品都是基于MySQL 5.7开发的,其中表名、字段名也许会用到MySQL8.0里新增的保留关键字,那么当项目上从MySQL 5.7升级到MySQL8.0后,就容易出现因为保留关键字引发的SQL语法错误。
问题示例
CREATE TABLE `emp` (
`id` int(11) NOT NULL,
`system` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
select id,system from emp
MySQL5.7环境表结构如下,其中包含system字段,查询正常
将MySQL5.7 升级到MySQL8.0后,再次查询,会发现SQL报错
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'system from emp' at line 1
原因
MySQL里SQL报错的原因是,system是MySQL8.0里新增加的保留关键字,必须要加上反引号``才能被识别到。
总结
很多老项目后面都会有升级MySQL8.0的需求,一旦遇到这种问题,就需要修改代码,要么给字段添加反引号查询,要么就直接替换字段名,都非常麻烦,所以最好在开发环节就避免掉。下面列举了MySQL8.0新增保留关键字
MySQL8.0新增保留关键字
CUME_DIST、DENSE_RANK、EMPTY、EXCEPT 、FIRST_VALUE、GROUPING、GROUPS 、JSON_TABLE、LAG 、LAST_VALUE、LATERAL 、LEAD、NTH_VALUE、NTILE 、OF、OVER 、PERCENT_RANK 、RANK、RECURSIVE、ROW_NUMBER、SYSTEM 、WINDOW