详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo讲解
    • 2.1 ONLY_FULL_GROUP_BY
    • 2.2 STRICT_TRANS_TABLES
    • 2.3 NO_ZERO_IN_DATE
    • 2.4 NO_ENGINE_SUBSTITUTION
    • 2.5 ANSI_QUOTES

前言

了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维

对于基本的命令行以及优化推荐阅读:

  1. 数据库中增删改常用语法语句(全)
  2. Mysql优化高级篇(全)

1. 基本知识

SQL_MODE 是 MySQL 中用于设置 SQL 语法和行为的系统变量

控制 MySQL 的 SQL 解析和执行的方式,使其与 SQL 标准或其他数据库系统的行为一致
通过设置 SQL_MODE,可以改变 MySQL 处理特定 SQL 操作的方式

  • MySQL 5.7
    默认 SQL_MODE 包括:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION

  • MySQL 8.0
    默认 SQL_MODE 包括:ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION

相比之下,MySQL 8.0 中没有太大变化,但 NO_AUTO_CREATE_USER 被移除了,因为 MySQL 8.0 取消了自动创建用户的特性

2. Demo讲解

常见的 SQL_MODE 设置和示例,以帮助理解其影响

2.1 ONLY_FULL_GROUP_BY

控制对于 GROUP BY 子句的处理方式
在默认情况下,MySQL 允许在 SELECT 查询中使用 GROUP BY 子句时,对于不在 GROUP BY 子句中的非聚合列进行隐式处理,可能导致意外的结果

ONLY_FULL_GROUP_BY 关闭的情况下,MySQL可能会随意选择一行来代表每个分组,而不是严格按照 SQL 标准进行操作,如下:

 this is incompatible with sql_mode=only_full_group_by

截图如下:

在这里插入图片描述

对此设置为ONLY_FULL_GROUP_BY 模式

-- 开启 ONLY_FULL_GROUP_BY 模式
SET sql_mode = 'ONLY_FULL_GROUP_BY';-- 查询每个学生的平均成绩
SELECT name, AVG(salary) AS avg_salary FROM employees GROUP BY name;

在这里插入图片描述

2.2 STRICT_TRANS_TABLES

STRICT_TRANS_TABLES 模式下,如果插入的数据有问题(如超出字段长度或类型不匹配),MySQL 会报错并回滚事务

-- 设置 SQL_MODE 为 STRICT_TRANS_TABLES
SET sql_mode = 'STRICT_TRANS_TABLES';-- 创建表
CREATE TABLE demo_strict (id INT,name VARCHAR(5)
);-- 尝试插入超长数据
INSERT INTO demo_strict VALUES (1, 'TooLongName');

执行结果下:

INSERT INTO demo_strict VALUES (1, 'TooLongName');
[Err] 1406 - Data too long for column 'name' at row 1

截图如下:

在这里插入图片描述

2.3 NO_ZERO_IN_DATE

-- 设置 SQL_MODE 为 NO_ZERO_IN_DATE, NO_ZERO_DATE
SET sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE';-- 创建表
CREATE TABLE demo_date (id INT,date_field DATE
);-- 尝试插入无效日期
INSERT INTO demo_date VALUES (1, '2020-00-00');

但在执行的过程中是可以成功的,但查询的时候日期显示未0000-00-00
为了避免这种插入无效日期,应该更改为:

-- 确保启用严格模式和日期模式
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE';-- 创建表
CREATE TABLE demo_date (id INT,date_field DATE
);-- 尝试插入无效日期
INSERT INTO demo_date VALUES (1, '2020-00-00');

最终结果如下:

[Err] 1292 - Incorrect date value: '2020-00-00' for column 'date_field' at row 1

截图如下:

在这里插入图片描述
确保输出包含 STRICT_TRANS_TABLES 和日期相关的模式:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,...

2.4 NO_ENGINE_SUBSTITUTION

指定的存储引擎不可用,则会报错,而不是使用默认的存储引擎

-- 设置 SQL_MODE 为 NO_ENGINE_SUBSTITUTION
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';-- 尝试创建不存在的存储引擎的表
CREATE TABLE demo_engine (id INT
) ENGINE=NON_EXISTENT_ENGINE;

报错结果如下:[Err] 1286 - Unknown storage engine 'NON_EXISTENT_ENGINE'

截图如下:

在这里插入图片描述

2.5 ANSI_QUOTES

双引号用于标识符,而不是字符串

-- 设置 SQL_MODE 为 ANSI_QUOTES
SET sql_mode = 'ANSI_QUOTES';-- 尝试使用双引号作为标识符
CREATE TABLE "demo_quotes" ("id" INT,"name" VARCHAR(50)
);-- 插入数据
INSERT INTO "demo_quotes" ("id", "name") VALUES (1, 'John Doe');

截图如下:

在这里插入图片描述

成功插入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走,解决你的问题,如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

AI炒股:获取个股的历史成交价格并画出K线图

任务:获取贵州茅台的近几个月的价格数据,绘制k线图; 在deepseek中输入提示词: 你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下: 用AKShare库获取股票贵州茅台&#xf…

PID算法在电机速度控制上的应用

目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …

3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount ,使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作,将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…

如何让 AI 自动阅读文档样例,编写符合你需求的代码?

(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 痛点 我本科读的计算机专业。当时编程,讲究的就是个扎实。例如哈夫曼编码用来压缩解压文件,那真的是自己一行行代码写过来的。更…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(如何使用自定义数据集)

目录 一、前言二、工作流程回顾三、详细步骤流程1. 环境配置2. 数据准备数据集下载数据存储结构&路径查看图片 3. 数据转换4. 自定义数据集(Custom Dataset )4.1 方法一:使用ImageFolder加载数据集信息查看张量转图片创建DataLoader 4.2 …

Java Web学习笔记12——JavaScript字符串

String&#xff1a; String字符串对象创建方法有两种&#xff1a; 方式一&#xff1a; var str new String("Hello String"); 方式二&#xff1a; var str "Hello String"; 常见的属性和方法&#xff1a; <!DOCTYPE html> <html lang"…

SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17为SwiftUI带来了一个新的组件ContentUnavailableView&#xff0c;它允许我们向用户呈现一个空状态&#xff0c;而不需要创建自定义错误或者无内容视图。 ContentUnavailableView易于使用&#xff0c;可自定义&#xff0c;并且具有用于空搜索状态的预定义视图。 建议在无…

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接&#xff1a;http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了&#xff0c;并且还学会了如…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数&#xff0c;比如常见的nvme list&#xff0c;nvme id-ctrl等&#xff0c;都是获取SSD的基本信息&#xff0c;也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者&#xff0c;我们并不知道nvme-cli源码怎么实现…

光波长 深入程度

UV深入程度&#xff08;UVC&#xff0c; UVB&#xff0c; UVA&#xff09;https://mp.weixin.qq.com/s?__bizMzkwNTM0Njk3MA&mid2247483934&idx1&sn92d1ba67ead404e7714af11ec0526786&chksmc0f868ebf78fe1fd0610493e6f49a5d90835a20a829a900746906cda12f2fa12…

ultralytics-极市平台打榜

ultralytics 应用教程 ultralytics简介 UltralyticsYOLOv8YOLOv8 基于深度学习和计算机视觉领域的尖端技术,在速度和准确性方面具有无与伦比的性能。其流线型设计使其适用于各种应用,并可轻松适应从边缘设备到云 API 等不同硬件平台。链接 安装教程 作为第三方python包直接…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段&#xff0c;如果vlan间没有三层技术&#xff0c;那么它们就无法互相通信。 vlan间路由可以有3种方式&#xff1a; 1.直接使用路由器转发 *路由器本身不需要额外设置&#xff0c;只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…

springboot3 一些听课笔记(1)

文章目录 一、日志框架二、springboot 自动配置三 、springweb3.13.2 自己编写一个messageconvert3.2.2 如果我们想让其支持yaml格式呢&#xff1f; 一、日志框架 springboot底层 默认使用logbacksjf4j作为日志框架。 1、每个 starter 场景&#xff0c;都会导入一个核心场景 …

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求&#xff0c;在服…

Jail管理器AppJail的使用@FreeBSD

Jail的简介 Jail是FreeBSD操作系统中一个功能强大的安全机制&#xff0c;自FreeBSD 4.X版本起便投入使用&#xff0c;并且随着系统的发展&#xff0c;其功能、效率、稳定性和安全性得到了持续的强化。 Jail基于chroot的概念&#xff0c;通过更改一系列程序的根目录&#xff0…

基于包围盒的机械臂防碰撞算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 5.完整工程文件 1.课题概述 基于包围盒的机械臂防碰撞算法。在实际情况中&#xff0c;由于很多对象结构较为复杂&#xff0c;当目标对象与障碍物之间的包围盒相交的时候&#xff0c;而两个物体并不相交。这就需要进一步划…

js 一维数组转多维数组

效果图&#xff1a; //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…