关于sql_mode的一次总结

       最近,公司做一个关于无人机应用的项目,需要给客户搭一套正式系统在阿里云服务器上。使用的数据库是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

 

 

你可能感兴趣的:(spring,java,mysql)