官方手册:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html


严格模式(strict mode)

严格模式是指将 sql_mode 设置为 STRICT_TRANS_TABLESSTRICT_ALL_TABLES 中的至少一种

STRICT_TRANS_TABLES

为事务性存储引擎启用严格模式,拒绝无效的数据值。

STRICT_ALL_TABLES

为所有存储引擎启用严格模式,拒绝无效的数据值。

SQL语法支持相关

ONLY_FULL_GROUP_BY

对于 GROUP BY 聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个SQL是不合法的,因为列不在 GROUP BY 从句中。 :::tips 注意:该配置会在5.7.5版本默认开启,所以升级版本时需要特别注意~

  • 相关报错以及处理方案请参考这篇文章 :::

    ANSI_QUOTES

    启用后,不能用双引号来引用字符串,因为双引号将被解释为标识符,作用于 ``` 一样

    PIPES_AS_CONCAT

    || 视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数 Concat() 类似

    数据检查相关

    ALLOW_INVALID_DATES

    不完全对日期合法性作检查,只检查月份是否在1~12,日期是否在1~31之间;仅对 DATEDATETIME有效,而对 TIMESTAMP 无效,因为 TIMESTAMP 总要求一个合法的输入

    NO_ZERO_DATE

    设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告

    NO_ENGINE_SUBSTITUTION

    如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

    ERROR_FOR_DIVISION_BY_ZERO

    INSERTUPDATE 过程中,如果数据被零除,则产生错误而非警告。如果未设置该模式,当数据被零除时MySQL返回 NULL

    NO_AUTO_CREATE_USER

    禁止 GRANT 创建密码为空的用户