Linux上合理设置sql_mode

148 阅读2分钟

sql_mode 会影响MySQL支持的SQL语法以及它执行的数据验证检查。通过设置 sql_mode 可以完成不同严格程度的数据校验,有效地保障数据准确性。

sql_mode定义了MySQL应该支持的sql语法,对数据的校验规则等。

查看当前MySQL的sql_mode值

select @@GLOBAL.sql_mode;
-- 或 
select @@SESSION.sql_mode

在这里插入图片描述

常用的 sql_mode :根据下表可以看出MySQL5.7默认的 sql_mode 模式就很严格

sql_mode 值说明
ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
STRICT_TRANS_TABLES如果一个值不能插入到一个事务中,则中断当前的操作,对非事务表不做限制
NO_ZERO_IN_DATE不允许日期和月份为零
NO_ZERO_DATEmysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL
NO_AUTO_CREATE_USER禁止GRANT创建密码为空的用户
NO_ENGINE_SUBSTITUTION如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
PIPES_AS_CONCAT将“||” 视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat相类似
ANSI_QUOTES不能用双引号来引用字符串,因为它被解释为识别符

设置sql_mode

临时设置:设置当前窗口的sql_mode 为 STRICT_TRANS_TABLES

-- 全局设置
set global sql_mode = 'STRICT_TRANS_TABLES' 
-- 当前会话
set session sql_mode = 'STRICT_TRANS_TABLES' 

永久设置方式:

在 /etc/my.cnf 文件的 [mysqld] 下新增:

sql_mode=STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO

然后重启MySQL服务。