Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQLmode最佳实践

SQLmode最佳实践

作者头像
MySQL技术
发布于 2019-09-08 01:22:49
发布于 2019-09-08 01:22:49
1.4K00
代码可运行
举报
文章被收录于专栏:MySQL技术MySQL技术
运行总次数:0
代码可运行

简介:

MySQL服务可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。我们可以设置全局SQL模式以匹配应用程序要求,不同的sql_mode影响服务端支持的SQL语法以及数据校验规则。

1.默认模式及更改方法

MySQL5.7默认的SQL模式包括以下模式: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。(不同版本可能稍有不同)

查看sql_mode:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show variables like 'sql_mode';+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+| Variable_name | Value                                                                                                                                     |+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+| 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 |+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.01 sec)

sql_mode参数分为全局和会话级别,可以动态修改

若在MySQL运行时更改SQL模式,可以使用SET语句设置全局或会话变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET GLOBAL sql_mode = 'modes';SET SESSION sql_mode = 'modes';

设置GLOBAL变量需要该 SUPER权限,并影响从该时间开始连接的所有客户端的操作。设置SESSION变量仅影响当前客户端。每个客户端都可以随时更改其会话 sql_mode值。若想永久生效需要将sql_mode变量写入配置文件中。

要确定当前的全局或会话sql_mode值,可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode;
2.sql_mode常用模式解析

此处只列出部分常见值,并非全部。

  • ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的。
  • STRICT_TRANS_TABLES:为事务存储引擎启用严格的SQL模式,在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。
  • NO_ZERO_IN_DATE:在严格模式下,日期格式(月日)不支持'00'。
  • NO_ZERO_DATE:设置该值,mysql数据库不允许插入'0000-00-00'日期,插入零日期会抛出错误而不是警告。
  • ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL。
  • NO_AUTO_CREATE_USER:禁止使用GRANT语句创建密码为空的用户。
  • NO_ENGINE_SUBSTITUTION: 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。
  • PIPES_AS_CONCAT:将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。
  • NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
3.sql_mode参数建议

一般情况下,建议去掉ONLY_FULL_GROUP_BY,因为在复杂情况下可能导致聚合语句无法执行。具体采用严格或非严格模式可以根据需求来修改。注意该参数在不同实例要保持一致,不然可能会出现一条sql在此环境下可以执行 在另外一个环境不能执行的情况。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[905]MySQL的sql_mode解析与设置和MySQLdb._exceptions.OperationalError: (1055, “Expression
重启mysql:/etc/init.d/mysql restart 登录mysql:mysql -u root -p mysql ->select @@sql_mode; 验证sql_mode的值是否改变。
周小董
2020/10/29
1.2K0
MySQL 报错:5.7版本sql_mode=only_full_group_by问题
MySQL 5.7.9版本sql_mode=only_full_group_by问题 用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘col_user_6.a.START_TIME’ which is not functional
学到老
2018/03/19
1.4K0
mysql5.7.5版本的sql_mode=only_full_group_by问题
mysql5.7.5版本默认设置了sql_mode=only_full_group_by,造成了之前使用的sql语句有些会出现sql_mode=only_full_group_by错误,接下来为解决此类问题的方法。
余生大大
2022/10/25
4340
MySQL的sql_mode模式说明及设置
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。
星哥玩云
2022/08/18
2.1K0
MySQL报错1055 – Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解决方法
今天在进行数据迁移时,使用Navicat连接数据库进行连接时,由于 SQL语句中使用了 group by分组函数,结果报了如下错误:
Java架构师必看
2021/03/22
2.3K0
MySQL报错1055 – Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 解决方法
MySQL sql_mode
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式。所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。
用户10325771
2023/03/01
6410
MySQL中的SQL Mode及其作用
与其它数据库不同,MySQL可以运行在不同的SQL Mode下。SQL Mode定义MySQL应该支持什么样的SQL语法,以及它应该执行什么样的数据验证检查。
数据和云
2021/07/30
1.8K0
mysql Invalid default value for 'time'
原因:安装的MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00",出现异常:Invalid default value for 'time'
joshua317
2021/04/23
2.2K0
【数据库】MySql的sql_mode模式说明
mysql5.7+的版本中,sql_mode为严格模式。比如必须给字段默认值,更新数据的长度必须符合限制等。
参谋带个长
2023/04/28
1.7K0
MySQL5.7版本sql_mode=only_full_group_by问题解决办法
原因分析:MySQL5.7版本默认设置了 mysql sql_mode = only_full_group_by 属性,导致报错。
全栈程序员站长
2022/08/24
6390
MySQL5.7版本sql_mode=only_full_group_by问题解决办法
GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause
标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM 、AVG 等)、常量。我们来看个例子
chenchenchen
2021/09/06
3.2K0
mysql 5.7 sql_mode设置问题
在mysql较低版本中,对SQL语句并没有严格的限制检查,在5.7及以上版本开启严格模式,在插入数据的时候,如果字段没有设置默认值,则会报类似于这样的错误:“Field ‘title’ doesn’t have a default value”。
参谋带个长
2022/04/28
1.3K0
MySQL sql_mode的坑及严格模式详解
mysql可以为不同的客户端设置不同的sql_mode,并且每个应用能够设置他自己的会话级别的sql_mode。sql_mode会影响sql语法以及mysql显示数据的正确性。
Petrochor
2022/06/07
2.8K0
浅谈MySQL的sql_mode
今天我们来分享一下MySQL的SQL mode , 这也是我们比较容易忽略的一点,我们在一开始安装数据库的时候其实就要先考虑要保留哪些SQL mode,去除哪些,合理的配置能够减少很多不必要的麻烦。
小四的技术之旅
2023/03/02
1.1K1
浅谈MySQL的sql_mode
MySQL中的sql_mode参数
对于group by聚合操作,如果在select中的列,没有在group by中出现,那么将认为这个sql是不合法的,因为列不在group by从句中。这里我们通过一个例子来看:
AsiaYe
2019/11/06
1.6K0
MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated colu
1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'fbjs.mscc.ContactTime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.000000s
JaneYork
2023/10/11
5440
MySQL报错1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated colu
MySQL windows解压版
配置环境变量: 选择PATH,在其后面添加: 你的mysql bin文件夹的路径 (如:C:\Program Files\MySQL\MySQL Server 5.6\bin )
用户10325771
2023/03/01
1.4K0
【MySQL】MySQL配置中sql_mode的作用
不知道你有没有踫到过这种问题,在 MySQL8 默认的情况下,我们之前习惯的为 DateTime 类型指定的 0000-00-00 这种格式是无法插入或者修改数据的。其实这种情况就是 MySQL 模式设置的问题,也就是我们今天要讲的 sql_mode 这个参数属性的作用。
硬核项目经理
2024/03/26
1990
【MySQL】MySQL配置中sql_mode的作用
MySQL案例:sql_mode详解
相信看过上一篇文章《MySQL案例:一个数据丢失惨》的童鞋,都应该意识到,sql_mode是一个非常关键的配置,接下来就带来该配置项的详细解析。
brightdeng@DBA
2020/12/12
1.8K0
MySQL案例:sql_mode详解
MySQL使用group by分组时报错
第一项默认开启ONLY_FULL_GROUP_BY了,导致出现了错误,需要把它的默认关掉。
Autooooooo
2020/11/09
1.7K0
MySQL使用group by分组时报错
推荐阅读
相关推荐
[905]MySQL的sql_mode解析与设置和MySQLdb._exceptions.OperationalError: (1055, “Expression
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验