MySQL的SQL MODE用于控制MySQL对SQL语句的执行和处理的模式,主要作用包括:
- 严格模式:例如
STRICT_ALL_TABLES
,在严格模式下,MySQL会更加严格地对待数据的插入、更新和删除操作,对于不合法的数据操作会返回错误信息,确保数据的完整性和一致性。- 数据校验:某些选项如
NO_ZERO_DATE
和NO_ZERO_IN_DATE
可以阻止插入或更新日期和时间类型的字段为零值,避免出现无效的日期或时间数据。- 数据类型转换:选项如
IGNORE_SPACE
和PIPES_AS_CONCAT
可以改变MySQL对于字符串和数字之间的隐式转换规则,从而影响表达式的计算结果。- 语法兼容性:某些选项如
ANSI_QUOTES
和ONLY_FULL_GROUP_BY
可以使MySQL的语法更加严格,以符合ANSI SQL标准,减少开发者在不同数据库系统之间切换时出现的语法差异问题。- 安全性:选项如
NO_BACKSLASH_ESCAPES
和NO_UNSIGNED_SUBTRACTION
可以提高MySQL的安全性,避免一些潜在的安全漏洞。
通过设置不同的SQL MODE选项,可以改变MySQL的执行和处理方式,从而提高数据的完整性、一致性和安全性。此外,SQL MODE的设置还可以帮助解决不同严格程度的数据校验问题,保证大多数SQL符合标准的SQL语法,以及在不同数据库之间进行数据迁移时使MySQL上的数据更方便地迁移到目标数据库中
SQL MODE |
解释 |
STRICT_TRANS_TABLES |
为事务存储引擎启用严格的sql模式,在插入不合法数据时,mysql将不再插入默认值,而是抛出错误,这样可以保证数据的完整性和一致性。 这种模式比较适合对数据完整性要求严格的场景。 |
ANSI |
等同于 REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE和ONLY_FULL_GROUP_BY |
TRADITIONAL |
为事务存储引擎启用严格的sql模式,在插入不合法数据时,mysql将不再插入默认值,而是抛出错误. 这样可以确保数据的完整性和一致性,这种模式比较适合对数据完整性要求更严格的场景. |
ONLY_FULL_GROUP_BY |
可以理解为让mysql像传统的sql数据库一样运行,等同于 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO 和NO_ENGINE_SUBTITUTION |
NO_BACKSLASH_ESCAPES |
如果某个列不在group by列表中,此时如果不对该列进行聚合处理,则该列不能出现在select列表,having条件中以及order by列表中 |
PIPES_AS_CONCAT |
启用此模式将禁止使用反斜杠字符”\”作为字符串和标识符中的转义字符,反斜杠将像其他字符一样变成普通字符 |
NO_ENGINE_SUBTITUTION |
将 ”||” 视为字符串连接操作符 |
NO_ZERO_DATE |
启用此模式时,如果创建或者更改表时指定了不可用的存储引擎,则报错不执行;未启用此模式时,会替换成默认存储引擎 |
ERROR_FOR_DIVISION_BY_ZERO |
启用此模式,’0000-00-00’则允许插入并成产生警告; 如果启用此模式和严格模式,则不允许’0000-00-00’插入,并会报错; 除非使用IGNORE. 对于insert ignore and update ignore,除以零插入NULL并产生警告 |
NO_ZERO_IN_DATE |
如果启用此模式,则零部分的日期将被插入’0000-00-00’并产生警告; 如果启用此模式和严格模式,则不允许包含0的日期输入,会直接报错. |
REAL_AS_FLOAT |
把REAL类型(存储大小4个字节,可精确到小数点后7位)看成FLOAT类型(存储大小为8字节,可精确到小数点后第15位) |
ANSI_QUOTES |
双引号将被视为标识符的引号,而不是字符串的引号 |
IGNORE-SPACE |
函数名称和(之间允许有空格,会导致内置的函数变成保留字) |
Sql mode文档地址:
MySQL :: MySQL 8.0 Reference Manual :: 7.1.11 Server SQL Modes