MySQL版本号不同导致的SQL语句报错,虽然差别不是很大,但是毕竟版本导致的差异还是客观存在,如果没发现是版本号不同的问题可能一直都会想不通明明之前还运行好好的搬过来之后就运行报错的原因。
一、情景再现
在生产环境上,将之前的SQL文件导入到了另一个数据库上。之后开启web服务正常,但是在访问个别方法的时候出现了500的报错,查看信息发现是SQL语句的问题。
这时候开始怀疑是不是自己动了后台的SQL语句,回忆之后觉得不太可能,但确实是报了SQL的错误。
后面考虑了许久,发现其他方法的SQL语句都没问题,但是只要涉及到了group by语句的SQL就会报错,于是定位到group by的报错问题上。通过检索问题,发现有可能是MySQL版本号不同所导致的SQL语句不兼容问题。那么就明确了解决方法,进行不同版本的兼容。
二、解决方案
我们进入到MySQL命令行,在navicat中能够远程进入:
右键你要操作的数据库,点击命令列界面就进入到了命令行窗口。
- 首先查看sql_mode
select @@global.sql_mode;
返回的值为:
ONLY_FULL_GROUP_BY这个值就是影响我们group by语句版本号不同引起差异的幕后黑手,我们进行重新设置sql_mode
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
更改全局sql_mode值,但是我们已经存在的数据库表还要修改sql_mode,继续执行以下语句:
set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
设置完之后不用重启即刻生效,大功告成。
参考资料: