iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 5.7之关于SQL_MODE的设置
  • 695
分享到

MySQL 5.7之关于SQL_MODE的设置

2024-04-02 19:04:59 695人浏览 八月长安
摘要

目录一、sql_mode用来解决下面几类问题二、Mysql5.7中sql_mode参数默认值的说明(如下为mysql 5.7.27版本)三、sql_mode 设置和修改总结sql_mode是个容易被忽视的变量,在5.5默

sql_mode是个容易被忽视的变量,在5.5默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。

在5.6中强化了该值设置,5.7中更注重了安全规范性,这个值默认为严格模式

一、sql_mode用来解决下面几类问题

通过设置sql mode,可以完成不同严格程度的数据校验,有效保障数据准备性。

通过设置sql mode 为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务sql进行较大的修改,可以很方便的迁移到目标数据库中。

二、MySQL5.7中sql_mode参数默认值的说明(如下为MySQL 5.7.27版本)

  • ONLY_FULL_GROUP_BY

对于使用 GROUP BY 进行查询的SQL,不允许 SELECT 部分出现 GROUP BY 中未出现的字段,也就是 SELECT 查询的字段必须是 GROUP BY 中出现的或者使用聚合函数的或者是具有唯一属性的。

create table test(name varchar(10),value int);
insert into test values ('a',1),('a',20),('b',23),('c',15),('c',30);
#默认情况是可能会写出无意义或错误的聚合语句:
SET sql_mode='';
select * from test group by name;
select value,sum(value) from test group by name;
# 使用该模式后,写法必须标准
SET sql_mode='ONLY_FULL_GROUP_BY';
select name,sum(value) from test group by name;
-- 错误写法则报错
select value,sum(value) from test group by name;
# 报错终止
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.test.value' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
  • STRICT_TRANS_TABLES

该选项针对事务性存储引擎生效,对于非事务性存储引擎无效,该选项表示开启strict sql模式。在strict sql模式下,在INSERT或者UPDATE语句中,插入或者更新了某个不符合规定的字段值,则会直接报错中断操作

create table test(value int(1));
SET sql_mode=''; #默认只要第一个值

insert into test(value) values('a'),(1); #不报错
insert into test(value) values(2),('a'); #不报错
select * from test;
+------------+
| value   |
+------------+
|     0 |
|     1 |
|     2 |
|     0 |
+------------+
#后面删除表不再说明!
drop table test;
create table test(value int(1));

SET sql_mode='STRICT_TRANS_TABLES'; #每个值都判断

insert into test(value) values('a'),(1);
#报错,第一行'a'错误。
ERROR 1366 (HY000): Incorrect integer value: 'a' for column 'value' at row 1
  • NO_ZERO_IN_DATE

MySQL中插入的时间字段值,不允许日期和月份为零

create table test(value date);
SET sql_mode='';
insert into test(value) values('2020-00-00'); #结果为 '2020-00-00'

SET sql_mode='NO_ZERO_IN_DATE';
insert into test(value) values('2021-00-00'); #不符合,转为 '0000-00-00'
  • NO_ZERO_DATE

MySQL中插入的时间字段值,不允许插入 ‘0000-00-00’ 日期

create table test(value date);

SET sql_mode='';
insert into test(value) values('0000-00-00'); #无警告 warning

SET sql_mode='STRICT_TRANS_TABLES';
insert into test(value) values('0000-00-00'); #无警告 warning

SET sql_mode='NO_ZERO_DATE';
insert into test(value) values('0000-00-00'); #有警告 warning

SET sql_mode='NO_ZERO_DATE,STRICT_TRANS_TABLES'
insert into test(value) values('0000-00-00');
# 报错终止
ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'value' at row 1
  • ERROR_FOR_DIVISION_BY_ZERO

INSERT或者UPDATE语句中,如果数据被0除,则出现警告(非strict sql模式下)或者错误(strict sql模式下)。

  • 当该选项关闭时,数字被0除,得到NULL且不会产生警告
  • 当该选项开启且处于非strict sql模式下,数字被0除,得到NULL但是会产生警告
  • 当该选项开启且处于strict sql模式下,数字被0除,产生错误且中断操作
create table test(value int);

SET sql_mode=''; 
select 10/0; #无警告 warning
insert into test(value) values(10/0);  #无警告 warning

SET sql_mode='STRICT_TRANS_TABLES';
select 10/0;  #无警告 warning
insert into test(value) values(10/0); #无警告 warning

SET sql_mode='ERROR_FOR_DIVISION_BY_ZERO';
select 10/0; #有警告 warning
insert into test(value) values(10/0); #有警告 warning

SET sql_mode='ERROR_FOR_DIVISION_BY_ZERO,STRICT_TRANS_TABLES';
select 10/0; #有警告 warning
insert into test(value) values(10/0);
#报错:ERROR 1365 (22012): Division by 0
  • NO_AUTO_CREATE_USER

禁止GRANT创建密码为空的用户

SET sql_mode='';
grant all on test.* to test01@'localhost'; #不报错(无需要设置密码)
SET sql_mode='NO_AUTO_CREATE_USER';
# 报错
ERROR 1133 (42000): Can't find any matching row in the user table

#正确 写法,需要设置密码
grant all on test.* to test01@'localhost' identified by 'test01...';
  • NO_ENGINE_SUBSTITUTION

在使用CREATE TABLE或者ALTER TABLE语法执行存储引擎的时候,如果设定的存储引擎被禁用或者未编译,会产生错误。

# 查看当前支持的存储引擎
show engines;

set sql_mode='';
create table test(id int) ENGINE="test";
Query OK, 0 rows affected, 2 warnings (0.03 sec)

select table_name,engine from infORMation_schema.tables where table_schema='test' and table_name='test'; # 转为默认存储引擎
+------------+--------+
| table_name | engine |
+------------+--------+
| test    | InnoDB |
+------------+--------+
SET sql_mode='NO_ENGINE_SUBSTITUTION';
create table test(id int) ENGINE=test;
# 报错
ERROR 1286 (42000): Unknown storage engine 'test'

三、sql_mode 设置和修改

方式一: 这是一个可修改全局变量

> show variables like '%sql_mode%';
> set @@sql_mode="NO_ENGINE_SUBSTITUTION"
> set session sql_mode='STRICT_TRANS_TABLES';

方式二: 通过修改配置文件(需要重启生效)

# vim /etc/my.cnf
[mysqld]
......
sql_mode="NO_ENGINE_SUBSTITUTION"
......

总结

SQL_MODE在非严格模式下,会出现很多意料不到的结果。建议线上开启严格模式。但对于线上老的环境,如果一开始就运行在非严格模式下,切忌直接调整,毕竟两者的差异性还是相当巨大。

官方默认的SQL_MODE一直在发生变化,MySQL 5.5, 5.6, 5.7就不尽相同,但总体是趋严的,在对数据库进行升级时,其必须考虑默认的SQL_MODE是否需要调整。

在进行数据库迁移时,可通过调整SQL_MODE来兼容其它数据库的语法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 5.7之关于SQL_MODE的设置

本文链接: https://www.lsjlt.com/news/33829.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL5.7之关于SQL_MODE的设置
    目录一、sql_mode用来解决下面几类问题二、MySQL5.7中sql_mode参数默认值的说明(如下为MySQL 5.7.27版本)三、sql_mode 设置和修改总结sql_m...
    99+
    2024-04-02
  • MySQL关于sql_mode解析与设置讲解
    昨晚在往MySQL数据库中插入一组数据时,出错了!数据库无情了给我报了个错误:ERROR 1365(22012):Division by 0;意思是说:你不可以往数据库中插入一个 除数为0的运算的结果。于是...
    99+
    2024-04-02
  • 关于mysql 5.7重置密码
     概述       今天偶然登录以前的mysql测试机,发现密码忘了,就先在my.cnf添加skip-grant-tables,通过跳过密码验证...
    99+
    2024-04-02
  • 怎样解释MySQL 5.7中sql_mode的含义
    这篇文章给大家介绍怎样解释MySQL 5.7中sql_mode的含义,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 MySQL 5.7版本中sql_mod...
    99+
    2024-04-02
  • mysql中如何设置sql_mode
    本篇文章为大家展示了mysql中如何设置sql_mode,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1,执行SQL查看select @@session....
    99+
    2024-04-02
  • mysql中怎么设置sql_mode值
    本篇文章为大家展示了mysql中怎么设置sql_mode值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。sql_mode常用值如下: ONLY_FULL_...
    99+
    2024-04-02
  • mysql中怎么设置sql_mode
    这篇文章给大家介绍mysql中怎么设置sql_mode,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认...
    99+
    2024-04-02
  • MySQL中sql_mode合理设置的示例分析
    这篇文章主要介绍了MySQL中sql_mode合理设置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL的sql_mode合...
    99+
    2024-04-02
  • 关于mysql设置utf8mb4字符集
    由于mysql默认的utf8其实是三个字节,所以如果字段里有emoji表情,就会放不进去数据库,报错形如 Internal Exception: java.sql.SQLException: Incorrect string value: ...
    99+
    2023-08-21
    mysql 数据库 java
  • MySQL中如何进行sql_mode查询与设置
    小编给大家分享一下MySQL中如何进行sql_mode查询与设置,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL的sql...
    99+
    2024-04-02
  • 【Django】关于错误django.db.utils.NotSupportedError: MySQL 5.7 or later is required (found 5.5.62).
    本来想用Django创建表,但是输入 python manage.py makemigrations然后就出错了,说是MYSQL兼容问题 解决方法 下载低版本的Django并且更新数据库可以解决(我...
    99+
    2023-09-04
    django mysql python
  • MySQL中关于Table cache该如何设置
    这篇文章将为大家详细讲解有关MySQL中关于Table cache该如何设置,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。因为今天突然有个凌晨5点值班任务,...
    99+
    2024-04-02
  • 怎么进行MySQL 5.7关于日期和时间的函数整理
    今天就跟大家聊聊有关怎么进行MySQL 5.7关于日期和时间的函数整理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 ...
    99+
    2024-04-02
  • 关于kali2.0上python的设置切
           由于之前一直在windows上学习python,安装的也是最新3.6。现在要转到linux下,首先面临的问题就是关于linux下默认版本的解决,目前kali2.0系统默认版本是python2。         本人电脑之前就...
    99+
    2023-01-31
    python
  • 关于Android Studio Http Proxy设置
    对敌人最大的蔑视就是沉默。--鹿丸 我们使用Android Studio  开始构建的时候会有卡顿的情况,甚至死机,也就是所谓的【android studio】构建卡住问题,如果依赖库类都是国内的,检查是否开启了代理    这个地方选...
    99+
    2023-09-22
    android
  • Windows下mysql 5.7 设置区分大小写(敏感),设置默认编码 utf8mb4
    修改编码 c盘下搜索 C:\ProgramData\mysql\MySQL Server 5.7 在该my.ini文件下进行配置修改 [client] default-character-set = utf8mb4 ...
    99+
    2024-04-02
  • MySQL 5.7如何在线设置忽略表复制方法
    这篇文章主要介绍MySQL 5.7如何在线设置忽略表复制方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! MySQL5.7版本后增加了在线设置忽略表复...
    99+
    2024-04-02
  • 关于python3的ThreadPoolExecutor线程池大小设置
    线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。 线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和内存资源上发生竞争,这不仅会导致更高的内...
    99+
    2023-05-16
    ThreadPoolExecutor线程池 线程池大小设置
  • vue3中关于路由hash与History的设置
    目录关于路由hash与History的设置1、history 关键字:createWebHistory2、hash 关键字:createWebHashHistory路由中h...
    99+
    2022-11-13
    vue3中路由 vue3路由hash vue3路由History
  • 关于MySQL关闭SSL的方法
    本文主要介绍了MySQL关闭SSL的简单方法,具有很好的参考价值,希望对大家有所帮助。 MySQL关闭SSL方法 查看是否开启SSL: 1 SHOW VARIABLES LIKE '%ssl%'; 看到have_ssl的值为Y...
    99+
    2023-09-09
    mysql ssl 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作