一. 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
- STRICT_TRANS_TABLES:存在部分失败则抛出错误,强制全部失败
- TRADITIONAL:存在错误时给出错误而非警告
- ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的,在5.7中默认启用。
五. 关于STRICT_TRANS_TABLES
- 无论何种mode,产生error之后就意味着单条sql执行失败,对于支持事务的表,失败回滚;但如果没有放在事务中执行或者不支持事务的存储引擎表,则可能导致数据不一致;
- MySQL认为,相比直接报错终止,数据不一致问题更严重;
- STRICT_TRANS_TABLES 和STRICT_ALL_TABLES对事务都是strict_mode,失败中止操作,存在部分更新的情况;
- STRICT_TRANS_TABLES对非事务表依然尽可能的让写入继续,比如给个”最合理”的默认值或截断