MySQL运维实战(4.2) 关于SQL_MODE

俊达1年前技术文章314

早期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运维实战(1.1)安装部署:使用RPM进行安装部署

MySQL运维实战(1.1)安装部署:使用RPM进行安装部署

我们在生产环境部署mysql时,一般很少使用rpm。用rpm或或者其他包管理器安装mysql,好处是安装简单,而且很多系统可能都自带了某个版本的mysql。但是使用RPM安装也存在一些缺点:1、rpm...

MySQL运维实战之ProxySQL(9.3)使用ProxySQL实现读写分离

proxysql读写分离主要通过mysql_query_rules表中的规则来实现。下面是具体的配置步骤:hostgroup配置insert into mysql_servers&...

MySQL运维实战之备份和恢复(8.7)将数据库恢复到指定时间点的另外一种方法

使用mysql原生复制功能实现时间点恢复使用mysqlbinlog解析并执行binlog是实现mysql时间点恢复的一种常用的方法。这里提供另外一种实现时间点恢复的方法:使用mysql的复制功能来实现...

MySQL运维实战(5.4) MySQL元数据乱码

表结构Comment乱码如果DDL实际编码和character_set_client设置不一致,也会引起乱码。$ cat test_comment_utf8.sql create...

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

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

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

MySQL运维实战(4.6) SQL_MODE之NO_BACKSLASH_ESCAPES

设置NO_BACKSLASH_ESCAPES后,反斜杠(\)不作为转义符。不设置NO_BACKSLASH_ESCAPES时,反斜杠(\)用来转义后一个字符mysql> create&n...

发表评论    

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