目录
举例:
--常见SQL mode
--mysql8 sql_mode 官方文档
https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html
--查看全局的SQL MODE
select @@global.sql_mode;
--查看当前会话的SQL MODE
select @@session.sql_mode;
--运行时修改全局的SQL mode
set global sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
--修改当前会话的SQL mode
set session sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
--删除当前会话的SQL mode
set session sql_mode = sys.list_drop(@@session.sql_mode,'ONLY_FULL_GROUP_BY');
--增加SQL mode模式
set session sql_mode = sys.list_add(@@session.sql_mode,'PIPES_AS_CONCAT');
举例:
CREATE TABLE test_stu (
a VARCHAR(20),
b VARCHAR(255)
);
INSERT INTO test_stu(a, b) VALUES('test1', 'test11');
这是添加sql mode之前的查询结果
添加PIPES_AS_CONCAT模式
set session sql_mode = sys.list_add(@@session.sql_mode,'PIPES_AS_CONCAT');
添加后查询结果
--常见SQL mode
PIPES_AS_CONCAT :将"||"视为字符串的连接操作符而非或运算符,与Oracle数据库的处理方式相同。
STRICT_TRANS_TABLES :在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。
REAL_AS_FLOAT :把REAL类型看成FLOAT类型
ANSI_QUOTES :启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符。
IGNORE_SPACE :函数名称和括号之间允许有空格。
ONLY_FULL_GROUP_BY :要求SELECT语句中的列要么出现在GROUP BY子句中,要么被包含在聚合函数内。如果列没有在GROUP BY子句中出现,且又不是聚合函数的一部分,则该SQL语句不合法。
NO_AUTO_VALUE_ON_ZERO :影响自增长列的插入。通常插入0或NULL时会生成下一个自增长值,但启用此模式后,如果想明确插入值为0,则需要使用此模式。
NO_ZERO_IN_DATE :在严格模式下,不允许日期和月份为零。
NO_ZERO_DATE :设置该值后,数据库不允许插入零日期,如果尝试插入零日期会抛出错误而不是警告。
ERROR_FOR_DIVISION_BY_ZERO :在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果不设置此模式,那么数据被零除时MySQL返回NULL。
NO_AUTO_CREATE_USER :禁止GRANT创建密码为空的用户。
NO_ENGINE_SUBSTITUTION :如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。
NO_BACKSLASH_ESCAPES :用于控制是否允许在SQL语句中使用反斜杠(\)作为转义字符。当设置为0时,表示不允许使用反斜杠作为转义字符;当设置为1时,表示允许使用反斜杠作为转义字符。
ANSI :等同于REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、ONLY_FULL_GROUP_BY几个模式的组合