Mysql之SQL Mode用法详解

Mysql之SQL Mode用法详解

什么是SQL Mode?

SQL Mode是MySQL数据库中的一个参数,它用来决定哪些操作是合法的,哪些操作是非法的。SQL Mode是MySQL的一个特性,一个相同版本的MySQL可能会有不同的SQL Mode。

SQL Mode的作用

SQL Mode的作用主要有以下几点:

  • 限制从Mysql5.7.4版本增强型SQL模式中删除的旧SQL特性的使用,以接近ANSI SQL标准。使开发者更加规范化地使用SQL语言编写代码,防止因为特性缺失而导致不可预知的错误。
  • 限制MySQL执行时的隐式转换,避免数据丢失、误差等结果。
  • 详细抛出在开发和调试时通常看不到的警告和错误信息,让开发人员能够更好地了解自己的代码是否存在问题。
  • 采用更严格的语法,有助于保持数据的一致性和安全性。

SQL Mode的用法

SQL Mode的用法分为以下两种方式:

手动设置SQL Mode

SET sql_mode = 'modes';

modes是SQL Mode的模式参数,表示可以设置多个模式参数组成的字符串,下面是一个示例:

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

配置my.cnf文件设置SQL Mode

my.cnf文件是MySQL服务器的配置文件,可以通过修改my.cnf文件中的参数,来设置MySQL的SQL Mode。

[mysqld]
sql_mode=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模式的作用:

假设有以下数据表:

CREATE TABLE users(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT NOT NULL
);

INSERT INTO users(name, age) VALUES ('Alice', 17);

使用以下查询语句,会提示错误:

SELECT name FROM users GROUP BY age;

提示错误信息:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause 
and contains nonaggregated column 'test.users.name' which is not functionally 
dependent on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by

因为在ONLY_FULL_GROUP_BY使用下,GROUP BY必须包含所有的查询字段,这里的name字段没有被包含进GROUP BY中。关闭ONLY_FULL_GROUP_BY模式,可以不必需要GROUP BY所有的查询字段。使用以下语句关闭ONLY_FULL_GROUP_BY模式:

SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

再次执行查询语句:

SELECT name FROM users GROUP BY age;

现在可以查询到结果了,输出:

+-------+
| name  |
+-------+
| Alice |
+-------+

以下示例演示NO_ZERO_DATE模式的作用:

假设有如下数据表:

CREATE TABLE stall(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  product_date DATE NOT NULL
);

插入一条数据:

INSERT INTO stall(name, product_date) VALUES('虫草花', '0000-00-00');

执行查询操作:

SELECT * FROM stall;

输出内容:

+----+--------+--------------+
| id | name   | product_date |
+----+--------+--------------+
|  1 | 虫草花 | 0000-00-00   |
+----+--------+--------------+

由于product_date字段插入了0000-00-00的日期,正常情况下应该是出现错误的,但由于NO_ZERO_DATE模式没有开启,不会提示错误。

现在开启NO_ZERO_DATE模式:

SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE';

再次执行查询操作:

SELECT * FROM stall;

此时输出错误信息:

ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'product_date' at row 1

因为NO_ZERO_DATE模式会检测并禁止0000-00-00的日期,在插入该日期时,会提示错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql之SQL Mode用法详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • SQL Server中锁的用法

    SQL Server中锁的用法是保证多个用户同时进行修改时,不会出现数据冲突的关键。锁可以分为共享锁和排他锁两种类型,分别是控制多个用户同时读取和写入数据库的一种机制。 在SQL Server中,共享锁和排他锁可以通过以下方式创建: 共享锁(S锁):通过SELECT语句创建,用于保证并发读取数据时不会出现数据冲突。一个共享锁允许多个用户同时读取一个资源。 示…

    database 2023年5月21日
    00
  • Linux服务器被黑以后的详细处理步骤

    当Linux服务器被黑时,需要采取详细的处理步骤才能确保系统的安全。下面,我将提供一份完整的攻略,包含必要的步骤和示例,帮助您认真处理这个问题。 1. 确认服务器被黑 在开始处理之前,需要先确认服务器是否真的被黑了。以下是一些常见的指标: 系统性能下降或异常 系统日志中出现未知或异常的登录记录 未知的、新的或异常的用户账户 系统文件或配置文件的修改、删除或新…

    database 2023年5月22日
    00
  • 关于分布式锁的三种实现方式

    关于分布式锁的三种实现方式,可以分别是: 基于数据库的实现 基于Redis的实现 基于Zookeeper的实现 下面我们将一一进行详细讲解。 基于数据库的实现 基于数据库的实现是通过在数据库中建立一张锁表,并在其中插入一条记录来实现锁的控制。具体步骤如下: 建立数据库锁表。该锁表通常包含以下字段: 锁名(lock_name):用于区分不同的锁。 加锁时间(l…

    database 2023年5月22日
    00
  • 详解MySQL INNER JOIN:内连接

    MySQL INNER JOIN是一种关联查询方式,它会将两个表中符合指定条件的数据行进行匹配,返回这些数据匹配行的列结果。 MySQL INNER JOIN语法如下: SELECT 列1,列2,列3… FROM 表1 INNER JOIN 表2 ON 表1.列=表2.列 其中,SELECT语句用于选取需要返回的列。 FROM语句用于指定表名。 ON语句…

    MySQL 2023年3月9日
    00
  • 深入Oracle字符集的查看与修改详解

    深入Oracle字符集的查看与修改详解 什么是字符集? 字符集(Character Set)是计算机内部处理文字和符号的方法。计算机只识别二进制,所以在计算机内部,都是以二进制形式来进行文字和符号的处理。而字符集就是将二进制编码与对应的文字符号进行配对,用于计算机的文字和符号的识别、存储和显示。 Oracle 中的字符集被分为两类:单字节字符集(SBCS)和…

    database 2023年5月21日
    00
  • centos安装Redis和设置远程访问

    记录下步骤以后用到时翻一翻。 在centos下载依赖库: yum install gcc tcl   在redis官网的下载页面,这里可以选择离线包或在线下载。 我选择在线的,在下载页面往下拉到 Installation 这里官方已经教你如何在线下载了,我们按步骤来。   在centos找一个位置,我选择/usr/local/software/目录下 执行 …

    Redis 2023年4月13日
    00
  • 浅谈一下mysql数据库底层原理

    浅谈一下MySQL数据库底层原理 1. MySQL基础知识 1.1 MySQL简介 MySQL是一个关系型数据库管理系统,广泛用于Web应用程序的后台数据管理。MySQL是开源的,符合标准SQL,支持多种操作系统,包括Linux、Windows和Mac OS等。 1.2 MySQL的体系结构 MySQL的体系结构由许多不同的模块组成,主要包括连接器、管理器、…

    database 2023年5月19日
    00
  • idea中连接数据库时出现SSL错误的问题

    关于“idea中连接数据库时出现SSL错误的问题”,整理了以下攻略供大家参考: 问题描述 在使用idea连接MySQL数据库时,出现如下错误:SSL connection error: SSL is required but the server doesn’t support it 问题分析 出现该错误的主要原因是MySQL数据库需要SSL协议进行访问,但…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部