MySQL sql_mode修改不生效的原因及解决


Posted in MySQL onMay 07, 2021

前言

近期多次聊到sql_mode的话题,也是多次遇到相关问题,今天就趁热打铁,再给大家带来一个sql_mode的案例分享。

场景模拟

基于业务敏感性的考虑,下面涉及的表、存储过程等均非真实数据,但并不影响排查过程。

(1)客户侧开发童鞋创建了一个存储过程,该存储过程没有严格遵守group by标准语法

session 1:
mysql> delimiter //

mysql> create procedure test_for_group_by()
    -> begin
    -> select k,pad,count(*) from test.test group by k;
    -> end //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

(2)客户侧开发童鞋调用该存储过程,报错ERROR 1140;因为当时存储过程比较复杂,改造起来比较麻烦,所以客户侧选择修改sql_mode

session 1:
mysql> call test_for_group_by();
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'test.test.k'; this is incompatible with sql_mode=only_full_group_by

(3)客户侧修改完sql_mode,再次执行,发现仍然报错ERROR 1140

session 2:
mysql> 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';
Query OK, 0 rows affected (0.00 sec)

session 1:
mysql> call test_for_group_by();
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'test.test.k'; this is incompatible with sql_mode=only_full_group_by

(4)此时想到,修改系统变量,只对新建连接有效,对已有连接不起作用;于是,让客户侧重新建立连接,确认系统变量已生效,再次调用存储过程,但仍然报错ERROR 1140,重复尝试几次都是这个结果

session 3:
mysql> show variables like 'sql_mode';
+---------------+------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                  |
+---------------+------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> call test_for_group_by();
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'test.test.k'; this is incompatible with sql_mode=only_full_group_by

(5)进一步排查,让客户侧在该会话,执行非标准的group by语句,发现可以正常执行

session 3:
mysql> select user,host,count(*) From mysql.user group by user;
+---------------+-----------+----------+
| user          | host      | count(*) |
+---------------+-----------+----------+
| mysql.session | localhost |        1 |
| mysql.sys     | localhost |        1 |
| root          | localhost |        1 |
| rpl_user      | %         |        1 |
| test          | %         |        1 |
+---------------+-----------+----------+
5 rows in set (0.00 sec)

(6)继续排查发现,该存储过程的sql_mode,还是包括ONLY_FULL_GROUP_BY,因此执行报错

session 2:
mysql> select routine_catalog,routine_schema,routine_name,routine_type,created,last_altered,sql_mode from routines where routine_name='test_for_group_by';
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| routine_catalog | routine_schema | routine_name      | routine_type | created             | last_altered        | sql_mode                                                                                                                                  |
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| def             | test           | test_for_group_by | PROCEDURE    | 2020-12-24 12:12:10 | 2020-12-24 12:12:10 | 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 |
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

(7)这里我们也可以知道,系统变量修改只对新建对象有效,对已有对象不生效;解决办法很简单,重建该存储过程即可

session 3:
mysql> drop procedure test_for_group_by;
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter //

mysql> create procedure test_for_group_by()
    -> begin
    -> select k,pad,count(*) from test.test group by k;
    -> end //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> call test_for_group_by();
+--------+-------------------------------------------------------------+----------+
| k      | pad                                                         | count(*) |
+--------+-------------------------------------------------------------+----------+
| 393975 | 35227182905-15234265621-59793845249-15413569710-23749555118 |        1 |
| 495688 | 09512147864-77936258834-40901700703-13541171421-15205431759 |        1 |
| 497896 | 13152283289-69561545685-52868757241-04245213425-69280254356 |        1 |
| 498573 | 43131080328-59298106536-35954612339-97546855884-75769514803 |        1 |
| 500775 | 27590239742-20204899609-34345212327-79811525340-24267764271 |        1 |
| 501885 | 63188288836-92351140030-06390587585-66802097351-49282961843 |        1 |
| 503330 | 01495266405-82925129145-92643983850-90243995398-18709399387 |        1 |
| 503666 | 40929980986-33813039690-13155419391-97985458477-39771362212 |        1 |
| 504353 | 00505722282-72931248925-57037623248-81117963809-88658076981 |        1 |
| 514246 | 21979564480-87492594656-60524686334-78820761788-57684966682 |        1 |
+--------+-------------------------------------------------------------+----------+
10 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

总结

通过这个案例,我们可以知道,修改sql_mode系统变量,只对新建连接和新建对象(主要包括函数和存储过程)有效,对已有连接和已有对象不生效。

以上就是MySQL sql_mode修改不生效的原因及解决的详细内容,更多关于MySQL sql_mode修改不生效的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
Mysql开启外网访问
May 15 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
一篇文章弄懂MySQL查询语句的执行过程
详解MySQL主从复制及读写分离
MySQL 表空间碎片的概念及相关问题解决
MySQL kill不掉线程的原因
May 07 #MySQL
MySQL数字类型自增的坑
May 07 #MySQL
MySQL获取所有分类的前N条记录
May 07 #MySQL
教你解决往mysql数据库中存入汉字报错的方法
You might like
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
node.js中的require使用详解
2014/12/15 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
详解详解Python中writelines()方法的使用
2015/05/25 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
python如何实现数据的线性拟合
2019/07/19 Python
python matplotlib拟合直线的实现
2019/11/19 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
法律专业求职信
2014/05/24 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
物业工程部岗位职责
2015/02/11 职场文书