当前位置: > 数据库 > MySQL >

关于sql_mode的一次总结

时间:2019-05-05 17:50来源:linux.it.net.cn 作者:IT
  最近,公司做一个关于无人机应用的项目,需要给客户搭一套正式系统在阿里云服务器上。使用的数据库是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)
------分隔线----------------------------
栏目列表
推荐内容