sql_mode

sql_mode ( global | session )

复制代码
影响SQL语句的语法行为。默认值是空值

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-combo

  • ONLY_FULL_GROUP_BY

    对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

    sql 复制代码
    > SELECT id,name FROM tsm GROUP BY name;
    
    -- Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tsm.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by	0.020 sec
  • STRICT_TRANS_TABLES

  • STRICT_ALL_TABLES

    严格模式下,对非法数据报错

    sql 复制代码
    > insert into tsm2(id, t1) values(6, '2024-03-32 00:00:00'); 
    -- 非严格模式下,截断写入 t1 = 0000-00-00 00:00:00
    -- 严格模式下,报错 
    -- Error Code: 1292. Incorrect datetime value: '2024-03-32 00:00:00' for column 't1' at row 1
    
    > create table tsm4(id int primary key, c1 char(3), c2 varchar(3));
    > insert into tsm4(id, c1, c2) values(7, '123456', '123456');
    
    -- 非严格模式下,截断写入 c1 = 123  c2 = 123
    -- 严格模式下,报错 
    -- Error Code: 1406. Data too long for column 'c1' at row 1
    
    -- jdbc-mysql驱动默认会设置sql_mode为STRICT_TRANS_TABLES,所以即使mysql本身的sql_mode='', 超出长度也会报错, 如果要取消这一默认行为可以在连接参数上配置jdbcCompliantTruncation=false
  • NO_ZERO_IN_DATE

    需配合严格模式,拒绝日期字段中月份或日期部分为零的值。例如,'2000-00-01' 或 '2000-12-00', 但不防止'0000-00-00'。

  • NO_ZERO_DATE

    需配合严格模式,拒绝'0000-00-00'

  • ERROR_FOR_DIVISION_BY_ZERO

    需配合严格模式,在 INSERTUPDATE 过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

    sql 复制代码
    insert into tb(t1) values (10/0); --error
  • ANSI_QUOTES

    禁用双引号表示字符串,如"abc", 只能使用单引号表示字符串,如'abc'

    sql 复制代码
    insert into tb(t1) values ('abc');
    insert into tb(t1) values ("abc"); -- error
  • NO_UNSIGNED_SUBTRACTION

    在整型数值之间的减法,一个值得类型是 unsigned 的,那么默认结果也是 unsigned 的。若是结果是一个负数,则会产生一个错误

    sql 复制代码
    select num1 - num2 from test_table; -- 配置前,报错
    -- num1 - num2 如果其中一个是无符号数,结果为负数,报错
  • NO_BACKSLASH_ESCAPES

    (禁用反斜线转义)这个模式启用,反斜线将会变成一个普通的字符串。

    sql 复制代码
    select 'abc\tdef' => 'abc    def'; -- 配置前
    select 'abc\tdef' => 'abc\tdef'; -- 配置后
  • PIPES_AS_CONCAT

    将"||"视为字符串的连接操作符而非或运算符

    sql 复制代码
    select '111'||'222'; => '1' -- 配置前
    select '111'||'222'; => '111222' -- 配置后
  • IGNORE_SPACE

    忽略函数名和右边括号之间的空格

    sql 复制代码
    select count(1) from tsm2;
    select count (1) from tsm2; -- 默认会报错        
  • ASNI

    更符合标准 SQL , 等同于 REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,

    ONLY_FULL_GROUP_BY.

  • TRADITIONAL

    等同于 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION.

相关推荐
Coder码匠1 小时前
Dockerfile 优化实践:从 400MB 到 80MB
java·spring boot
李慕婉学姐8 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
Chasing Aurora9 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
奋进的芋圆10 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin10 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model200510 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉10 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国11 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
萧曵 丶11 小时前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读
2501_9418824811 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言