抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

  MySQL的sql_mode是一组语法校验规则,在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题

sql_mode常用值如下

SQL语法支持类

ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
ANSI_QUOTES 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
PIPES_AS_CONCAT 将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
NO_TABLE_OPTIONS 使用 SHOW CREATE TABLE 时不会输出MySQL特有的语法部分,如 ENGINE,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑
NO_AUTO_CREATE_USER 禁止GRANT创建密码为空的用户

数据检查类

NO_ZERO_DATE 设置该值,不允许插入零日期,插入零日期会抛出错误而不是警告
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
STRICT_TRANS_TABLES 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_AUTO_VALUE_ON_ZERO 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了
NO_ZERO_IN_DATE 在严格模式下,不允许日期和月份为零
ERROR_FOR_DIVISION_BY_ZERO 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL
STRICT_TRANS_TABLES 设置它,表示启用严格模式

注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE出现少值或无效值该如何处理:

  1. 前面提到的把 ‘’ 传给int,严格模式下非法,若启用非严格模式则变成0,产生一个warning
  2. Out Of Range,变成插入最大边界值
  3. A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition

更多详细sql_mode,查看官方手册

  一般来说很少去关注它,没有遇到实际问题之前不会去启停上面的条目。我们常设置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ANSI和TRADITIONAL是上面的几种组合。

  • ANSI更改语法和行为,使其更符合标准SQL
  • TRADITIONAL更像传统SQL数据库系统,该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”

设置sql_mode

Mac下mysql配置文件位置

1
/private/etc/my.cnf

如果该目录下没有my.cnf,需要创建

1
2
cd  /private/etc/
sudo vim my.cnf

Linux下mysql配置文件位置

1
/etc/my.cnf

在my.cnf中加入

1
2
[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

更新配置信息

1
FLUSH PRIVILEGES

例如ERROR【SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause】的错误,需要取消ONLY_FULL_GROUP_BY

例如SQL导入时会遇到【Error Code: 1067. Invalid default value for xxx】的错误,则是需要取消NO_ZERO_IN_DATE、NO_ZERO_DATE

评论