关于MySQL中sql_mode

一. sql_mode的作用:

sql_mode直接影响到SQL语法检查条件

二. 关于Mysql 的版本:

Mysql 5.7支持的MODE有:[ONLY_FULL_GROUP_BY], [STRICT_TRANS_TABLES], [NO_ZERO_IN_DATE], [NO_AUTO_CREATE_USER],[NO_ZERO_DATE],[ERROR_FOR_DIVISION_BY_ZERO], [NO_ENGINE_SUBSTITUTION]

其中[ONLY_FULL_GROUP_BY],[STRICT_TRANS_TABLES]是v5.7.5,
[NO_AUTO_CREATE_USER]是v5.7.7,[ERROR_FOR_DIVISION_BY_ZERO], [NO_ENGINE_SUBSTITUTION]是v5.7.8新增
5.6.6 以后版本默认就是[NO_ENGINE_SUBSTITUTION],[STRICT_TRANS_TABLES]
5.5~5.6.5 均默认为 ‘’

三. 如何设置

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';

可通过

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

查看当前的全局设置或者session mode值

注意:1. 主从数据表该值最好保持一致;2. 若存在分表,修改该值有风险

四. 最重要最常用的几个MODE值

1.ANSI:更改语法和行为,使其更符合标准SQL
相当于REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE

  1. STRICT_TRANS_TABLES:存在部分失败则抛出错误,强制全部失败
  2. TRADITIONAL:存在错误时给出错误而非警告
  3. ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的,在5.7中默认启用。

五. 关于STRICT_TRANS_TABLES

  1. 无论何种mode,产生error之后就意味着单条sql执行失败,对于支持事务的表,失败回滚;但如果没有放在事务中执行或者不支持事务的存储引擎表,则可能导致数据不一致;
  2. MySQL认为,相比直接报错终止,数据不一致问题更严重;
  3. STRICT_TRANS_TABLES 和STRICT_ALL_TABLES对事务都是strict_mode,失败中止操作,存在部分更新的情况;
  4. STRICT_TRANS_TABLES对非事务表依然尽可能的让写入继续,比如给个”最合理”的默认值或截断
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容