MySQL运维实战(4.2) 关于SQL_MODE

俊达2年前技术文章487

早期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运维实战之备份和恢复(8.9)xtrabackup备份指定表

备份部分表如果实例设置了参数innodb_file_per_table,xtrabackup可以备份部分表。通过--tables,--tables-file,--databases,--databas...

MySQL运维实战(3.3) 管理数据库(database)

数据库使用create database语句创建数据库。创建数据库的账号需要有create权限。创建数据库用户拥有create权限才能创建数据库。-- 例子:创建dba用户,拥有创建数据库名...

MySQL运维实战(5.5) 数据导入导出时的字符集问题

mysql可以使用load data/select into outfile或mysqldump工具进行数据导入导出。下面分别分析数据导入导出时的字符集相关问题。准备测试数据创建测试表,2个字段分别使...

MySQL运维实战之Clone插件(10.2)Clone插件原理

MySQL运维实战之Clone插件(10.2)Clone插件原理

clone插件实现clone操作主要分为几个阶段:1、初始阶段。初始阶段,会开启页面跟踪(Page Tracking)。开启页面跟踪后,修改过的页面的编号会被记录下来。页面的修改可分为两个阶段:首先在...

 MySQL运维实战(1.3)安装部署:源码编译安装

MySQL运维实战(1.3)安装部署:源码编译安装

源码编译安装通常不需要自己编译mysql源码,编译的mysql和二进制包的内容基本一致。当然有些时候可能会需要采用源码编译的方式安装,安装一些非标准版本的mysql安装一些社区的patch、bugfi...

MySQL运维实战(5.3) MySQL数据乱码的一些情况

MySQL运维实战(5.3) MySQL数据乱码的一些情况

表数据乱码当数据的真实编码和相关参数(常见的包括character_set_client, character_set_result, 字段的编码,终端的编码)不一致时,会产生乱码。测试1 - 表中的...

发表评论    

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