最近,公司做一个关于无人机应用的项目,需要给客户搭一套正式系统在阿里云服务器上。使用的数据库是mysql,mysql5.7.2.这个版本的数据库有默认的sql_mode.会自动设置为
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
由于云服务是在Linux环境下,在使用命令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';
在重启mysql server的时候sql_mode会恢复出厂设置(这个让我醉了很久)
解决方案:修改Linux下的my.cnf,win下的my.ini,如果有sql_mode的配置,修改成以上内容,没有的话就添加一条配置。
简单的处理,重启下mysql server,用select global @@sql_mode进行检查一下,没有“ONLY_FULL_GROUP_BY”即修改正确。
https://www.linuxidc.com/Linux/2017-08/146204.htm
在我使用项目的时候,我项目中使用mybatis的ORM框架,在对数据查询的时候有分组查询的sql,如果带有
“ONLY_FULL_GROUP_BY”,查询的时候会抛出异常
这是我的项目在查询接口的时候抛出来的问题,单独把sql拿出来执行,会明确定位到是sql_mode造成的影响。
https://www.linuxidc.com/Linux/2016-01/127234.htm
先贴个链接,简单总结一下
mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:
mysql> select @@sql_mode;
+----------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
或者通过查看系统变量方式:
mysql> show variables like 'sql_mode%'\G;
*************************** 1. row ***************************
Variable_name: sql_mode
Value: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
mysql5.0以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。
ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。
only_full_group_by:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,所以对于设置了这个mode的数据库,在使用group by 的时候,就要用MAX(),SUM(),ANT_VALUE()这种聚合函数,才能完成GROUP BY 的聚合操作。
关于sql_mode,这篇博文总结的很棒:https://blog.csdn.net/wangyunfeis/article/details/77911704