一、Sql_mode是什么?

Sql_mode是一组mysql的语法校验规则,定义了mysql应该支持的sql语法、数据校验等。

二、如何查看当前sql_mode配置?

方法一:select @@sql_mode;

方法二:select @@SESSION.sql_mode;

方法三:select @@GLOBAL.sql_mode;

三、如何设置sql_mode?

1、通过命令设置

SET sql_mode = '';

SET SESSION sql_mode = '';

SET GLOBAL sql_mode = '';

2、修改mysql的配置文件my.cnf,修改后需要重启mysql服务使其生效

四、Sql_mode模式
1、ANSI模式
这是一种宽松模式,该模式下,会对所操作数据进行校验,如果不符合校验规则,数据会按照规则执行,并报warning警告。

该模式下,sql_mode参数为:REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI

2、STRICT_TRANS_TABLES模式

这是一种严格模式,该模式下,会对所操作数据进行严格校验,如果不符合校验规则,报error错误。

该模式下,sql_mode参数为:STRICT_TRANS_TABLES

3、TRADITIONAL模式

这是一种严格模式,该模式下,会对所操作数据进行严格校验,如果不符合校验规则,报error错误。用于事务时,会进行事物的回滚,保证了错误数据无法插入到数据库中。

该模式下,sql_mode参数为:STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

注:模式2和3中,在插入不符合校验规则数据时候,都会失败,并报error错误。

五、常用sql_mode各参数详解

1、PIPES_AS_CONCAT

将“||”作为字符串的链接字符操作,而不是作为或运算符,与“concat”相类似。

2、ANSI_QUOTES

不能用双引号来引用字符串,因为它会被解释为识别符。

3、IGNORE_SPACE

用于忽略mysql系统函数与之后的括号之间的空格。

(1)创建一张名为count的表。

(2)用“`”将关键字引住,创建一张名为count的表。

(3)用空间间隔,创建一张名为count的表。

(4)统计函数count()在此时的表现。

(5)设置sql_mode为“IGNORE_SPACE”,可解决count()函数,括号之前的空格。

(6)设置sql_mode为“”后,某些语法失效。

4、STRICT_TRANS_TABLES和STRICT_ALL_TABLES

严格模式的一种,会对所操作数据进行严格校验。如果不符合校验规则,报error错误。

示例可参见四->2、STRICT_TRANS_TABLES模式。

说明:

(1)对于innodb表来说,此两种设置对于单个insert操作,无论插入单行或是多行,只要插入数据与字段类型不兼容,则insert操作失败并回滚;

(2)对于myisam表来说:

    A、STRICT_TRANS_TABLES,对于单个insert操作,插入单行数据与字段类型不兼容,则insert操作失败并回滚;插入多行数据,如果插入数据的第一行内容与字段类型不兼容,则insert操作失败并回滚,如果插入数据的第一行内容与字段类型兼容,但后续的数据行存在不兼容的情况,则兼容的数据正常插入,不兼容的数据会转换成符合字段类型的格式再插入,不会中断和回滚;

    B、STRICT_ALL_TABLES,如果插入数据的第一行内容与字段类型兼容,但后续的数据行存在不兼容的情况,则兼容的数据正常插入,不兼容的数据则会报错并终止insert操作。

NO_ZERO_IN_DATE
5、在严格模式下,不允许日期和月份为零。

6、NO_ZERO_DATE
在严格模式下,不允许插入0日期。

7、ERROR_FOR_DIVISION_BY_ZERO
在严格模式下,不允许在字段中插入除数为0的运算值,会直接报错。直接计算除数为0的运算,返回null,报warning。

8、ONLY_FULL_GROUP_BY
select后面的字段中,只能出现分组列和聚合列。

9、其他
NO_AUTO_CREATE_USER(用户)

ALLOW_INVALID_DATES(日期)

HIGH_NOT_PRECEDENCE(not优先级)

NO_AUTO_VALUE_ON_ZERO(主键)

NO_BACKSLASH_ESCAPES(反斜杠)

NO_DIR_IN_CREATE(数据目录)

NO_ENGINE_SUBSTITUTION(存储引擎)

NO_UNSIGNED_SUBTRACTION(无符号数相减计算

PAD_CHAR_TO_FULL_LENGTH(char字段存储

TIME_TRUNCATE_FRACTIONAL(时间类型超出范围处理)

六、不同版本默认的SQL_MODE

MySQL 5.5:空

MySQL 5.6:NO_ENGINE_SUBSTITUTION

MySQL 5.7: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

MySQL 8.0:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,  NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐