sql_mode值的含义

ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
 
 
NO_AUTO_VALUE_ON_ZERO
该值影响自增长列的插入。默认情况下,在对自增主键插入NULL或0时,会自动生成下一个值。若开启该MODE,当插入0时,并不会自动生成下一个值。
如果表中自增主键列存在0值,在进行逻辑备份还原时,可能会导致数据不一致。所以mysqldump在生成备份数据之前,会自动开启该MODE,以避免数据不一致的情况。

 
STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事物表中,则中断当前的操作,对非事物表不做限制。
 
 
NO_ZERO_IN_DATE
同NO_ZERO_DATE类似,只不过NO_ZERO_DATE针对的是'0000-00-00',而NO_ZERO_IN_DATE针对的是年不为0,但月或者日为0的日期,如,'2010-00-01' or '2010-01-00'。
实际效果也是取决于是否开启严格模式,同NO_ZERO_DATE一样。 
 
 
NO_ZERO_DATE
该MODE会影响'0000-00-00'的插入。实际效果还取决于是否开启严格模式。
1. 在开启严格模式,且同时开启该MODE,是不允许'0000-00-00'插入的。
2. 只开启严格模式,不开启该MODE,允许'0000-00-00'值的插入,且不提示warning。
3. 不开启严格模式,只开启该MODE,允许'0000-00-00'值的插入,但提示warning。
4. 不开启严格模式,也不开启该MODE,允许'0000-00-00'值的插入,且不提示warning。

 
ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL。
 
 
NO_AUTO_CREATE_USER
MODE禁止的只是不带“identified by”子句的grant语句,对于带有“identified by”子句的grant语句,其并不会禁止。
 
 
NO_ENGINE_SUBSTITUTION
在开启该MODE的情况下,在创建表时,如果指定的存储引擎不存在或不支持,则会直接提示“ERROR”。
若不开启,则只会提示“Warning”,且使用默认的存储引擎。
 
 
PIPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。
 
 
ANSI_QUOTES
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符。
 
 
ANSI
宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
 
 
TRADITIONAL
严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
 
 
STRICT_TRANS_TABLES
严格模式,进行数据的严格校验,错误数据不能插入,报error错误。


ALLOW_INVALID_DATES
若开启该MODE,对于month和day的检测会相对宽松。其中,month只需在1~12之间,day只需在1~31之间,而不管其是否有效,如下面的'2004-02-31'。注意,该MODE只适用于DATE和DATETIME,不适用于TIMESTAMP。
 
 
IGNORE_SPACE
默认情况下,函数名和左括号(“(”)之间不允许存在空格。若开启该MODE,则允许。


NO_BACKSLASH_ESCAPES
默认情况下,反斜杠“”会作为转义符,若开启该MODE,则反斜杠“”会作为一个普通字符,而不是转义符。


NO_DIR_IN_CREATE
默认情况下,在创建表时,可以指定数据目录(DATA DIRECTORY)和索引目录(INDEX DIRECTORY),若开启该MODE,则会忽略这两个选项。在主从复制场景下,可在从库上开启该MODE。


NO_UNSIGNED_SUBTRACTION
两个整数相减,如果其中一个数是无符号位,默认情况下,会产生一个无符号位的值,如果该值为负数,则会提示“ERROR”。


PAD_CHAR_TO_FULL_LENGTH
在对CHAR字段进行存储时,在Compact格式下,会占用固定长度的字节。
如下面的c1列,定义为char(10),虽然'ab'只占用两个字节,但在Compact格式下,会占用10个字节,不足部分以空格填充。
在查询时,默认情况下,会剔除掉末尾的空格。若开启该MODE,则不会剔除,每次都会返回固定长度的字符。


REAL_AS_FLOAT
在创建表时,数据类型可指定为real,默认情况下,其会转化为double,若开启该MODE,则会转化为float。


STRICT_ALL_TABLES
对事务表开启严格模式。


STRICT_TRANS_TABLES
对所有表开启严格模式。


TIME_TRUNCATE_FRACTIONAL
在时间类型定义了小数秒的情况下,如果插入的位数大于指定的位数,默认情况下,会四舍五入,若开启了该MODE,则会直接truncate掉。



MySQL各版本sql modes区别
5.5 
The default SQL mode is empty (no modes set).
 
 
5.6
The default SQL mode is NO_ENGINE_SUBSTITUTION.
 
 
5.7
The default SQL mode in MySQL 5.7 includes these modes: 
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, 
ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION.
 
These modes were added to the default SQL mode in MySQL 5.7: 
The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5. 
The NO_AUTO_CREATE_USER mode was added in MySQL 5.7.7. 
The ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE modes were added in MySQL 5.7.8.
 
 
8.0
The default SQL mode in MySQL 8.0 includes these modes: 
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, 
ERROR_FOR_DIVISION_BY_ZERO, and NO_ENGINE_SUBSTITUTION.
原文地址:https://www.cnblogs.com/l10n/p/12606231.html