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.