MySQL运维实战(4.2) 关于SQL_MODE

俊达2年前技术文章971

早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。

mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。


5.7 默认SQL_MODE

mysql> show global variables like '%sql_mode%'\G
*************************** 1. row ***************************
Variable_name: sql_mode
        Value: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


SQL_MODE

描述

ONLY_FULL_GROUP_BY

使用group by的SQL语句,select不在group by列表中的字段,需要使用聚合函数。

STRICT_TRANS_TABLES

严格模式,不允许非法数据写入到数据库中的事物型存储引擎(innodb)

NO_ZERO_IN_DATE

日期中不允许出现年、月或日为0的情况

NO_ZERO_DATE

不允许0000-00-00的日期

ERROR_FOR_DIVISION_BY_ZERO

除数为0时报错。

NO_AUTO_CREATE_USER

grant语句不自动创建用户

NO_ENGINE_SUBSTITUTION

建表指定的engine不存在时报错



除了5.7默认设置的这些SQL_MODE,还有一些SQL_MODE也值得关注:


其他SQL_MODE

SQL_MODE

描述

NO_BACKSLASH_ESCAPES

反斜杠(\)不用作转义符

NO_UNSIGNED_SUBTRACTION

unsigned整数参与到减法中时,不转换成unsigned。允许结果为负数。

PIPES_AS_CONCAT

使用|| 作为字符串连接的操作符号

ALLOW_INVALID_DATES

允许非法日期,如2021-02-31

ANSI_QUOTES

双引号(")可用做标识符(如表名、字段名)引用


后续分别测试这些SQL_MODE的影响。

相关文章

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

什么是BNLMySQL表关联时,如果关联条件上没有合适的索引,则join时,对于驱动表的每一条记录,都需要全表扫描被驱动表。如果驱动表有多条数据,则需要多次全表扫描被驱动表,查询性能很差。对于这种情况...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

MySQL运维实战之备份和恢复(8.1)xtrabackup全量备份

xtrabackup是percona开源的mysql物理备份工具。xtrabackup 8.0支持mysql 8.0版本的备份和恢复。xtrabackup 2.4支持mysql 5.7及以下版本的备份...

MySQL优化器特性(八)索引范围扫描成本计算

MySQL优化器特性(八)索引范围扫描成本计算

range执行计划中的range表示索引范围扫描。索引范围扫描的执行过程大致如下:1、根据where条件中索引字段的条件,定位到索引结构中的第一条满足条件的记录。2、根据索引中记录的rowid,到表中...

MySQL优化器特性(二)MRR优化

MySQL优化器特性(二)MRR优化

Index Range Scan索引范围扫描的一般步骤:1、根据where条件,从B+树定位到第一条记录。2、从索引页子节点中获取到行号(rowid),根据rowid回表查询数据。3、使用额外的whe...

MySQL优化器特性(一)IN和Exists(semijoin)子查询优化策略

这篇文章中的SQL和执行计划在mysql 8.0.31环境下进行测试。测试的表结构和数据:表结构mysql> show create table tp\G...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。