例如此语句 MySQL8执行就会报错,MySQL5.7则不会报错
insert into order (type, system) values ( 2, '动力');
报错信息提示SQL语法错误,指出位于'系统'字段(system)前面的内容存在问题。是由于使用了MySQL保留字(Reserved Words)做为字段名造成的,例如在此例中使用了名为system的字段。
修改后
insert into order (type, `system`) values ( 2, '动力');
在此例子中,使用了反引号将'system'字段名括起来,以避免解析器将其识别为保留字。
也就是说 在mybatis中的mapper.xml中 所有的关键字、保留字 都需要使用反引号给引起来。
在网上搜索过一些教程 说是禁用掉MySQL8的严格模式就可以忽略此错误
(我测试是没起作用,考虑到语法本身就是错误的而且为了安全 我就将所有mapper中的关键字、保留字都引起来了。如果有知道解决方法的 请评论 谢谢。)
MySQL 8.0版本提供了一个sql_mode参数来自定义MySQL的行为,这个参数可以设置为不检查关键字冲突。具体来说,你可以在MySQL 8.0中执行以下命令来禁用SQL模式STRICT_TRANS_TABLES,这样MySQL就会在插入时忽略掉无法转换为指定类型的值而不是抛出错误:
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
如果你需要一直禁用这种严格的语法检查,你可以修改MySQL的配置文件my.cnf或者my.ini,并在其中添加以下选项:
[mysqld]
sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
这些设置应该能够使MySQL 8.0版本不再报错关于未引用关键字的SQL语句。注意,如果您禁用了严格模式(STRICT_TRANS_TABLES),MySQL将不再对您输入的文本进行任何转义、转换或验证,可能会导致安全漏洞和其他问题。因此,一定要在权衡安全和方便性之后考虑使用这些设置。