| 
       
	  最近,公司做一个关于无人机应用的项目,需要给客户搭一套正式系统在阿里云服务器上。使用的数据库是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会恢复出厂设置(这个让我醉了很久) 
	如何使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 
	为什么要修改sql_mode的值? 
	在我使用项目的时候,我项目中使用mybatis的ORM框架,在对数据查询的时候有分组查询的sql,如果带有 
	“ONLY_FULL_GROUP_BY”,查询的时候会抛出异常 
	这是我的项目在查询接口的时候抛出来的问题,单独把sql拿出来执行,会明确定位到是sql_mode造成的影响。 
	那么问题来了,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 
	---------------------  
	作者:程序媛-kaka  
	来源:CSDN  
	原文:https://blog.csdn.net/dyhdengyahui/article/details/81901934  
	版权声明:本文为博主原创文章,转载请附上博文链接! 
      (责任编辑:IT) | 
    
