Mysql之SQL Mode用法详解

yizhihongxing

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日

相关文章

  • Linux Top 命令解析 比较详细

    Linux Top 命令解析 比较详细 简介 top 命令是 Linux 系统中查看系统性能的一个非常方便实用的命令。它能实时显示系统中各个进程的资源占用情况,并且可以通过 top 命令来查看系统的 CPU 使用率、内存使用率、进程数量、进程详细信息和系统负载等。在 Linux 系统管理员的工作中, top 命令是一个必不可少的工具。 top 命令的使用 t…

    database 2023年5月22日
    00
  • PHP封装的PDO数据库操作类实例

    下面我来详细讲解一下“PHP封装的PDO数据库操作类实例”的完整攻略。 1. 什么是PDO? PDO即PHP数据对象,是PHP5中一个提供访问数据库的统一接口的类库。也就是说,它可以为不同的数据库提供透明的、便捷的、轻便的、安全的访问方式,支持MySQL、Oracle、MS SQL Server等多种数据库。 2. PDO的优势 封装的PDO类具有以下优势:…

    database 2023年5月21日
    00
  • oracle 多个字符替换实现

    Oracle 多个字符替换的实现攻略 在 Oracle 数据库中,我们有时会需要将某个字段中的多个字符进行替换,这种情况下我们可以使用 REPLACE() 函数以及 TRANSLATE() 函数来实现。下面我们来详细说明具体的操作步骤。 使用 REPLACE() 函数进行多个字符替换实现 REPLACE() 函数用于将源字符串中的所有指定字符串替换为目标字符…

    database 2023年5月21日
    00
  • Mongodb 如何将时间戳转换为年月日日期

    将Mongodb中的时间戳转换为年月日日期,可以使用Mongodb的Aggregation框架对时间戳进行转换。下面是一个完整的攻略: 步骤一:通过Aggregation框架进行日期转换 在Mongodb的Aggregation框架中,可以使用$project和$dateToString管道操作符来进行日期转换。在使用$project操作符时,需要指定输出字…

    database 2023年5月21日
    00
  • SQL – 连接(内连接,左连接,右连接和全连接)

    请看下面的完整攻略。 SQL连接 在SQL中,连接(Join)是将两个或多个表中的行结合在一起,并基于这些表的关联列创建一个结果集。连接可以分为以下几种类型:内连接,左连接,右连接和全连接。 内连接(INNER JOIN) 内连接只返回那些两个表中匹配的行。也就是说,只有在两个表中都存在的记录才会被返回。内连接通常由一个JOIN关键字和一个ON子句来指定连接…

    database 2023年3月27日
    00
  • 解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]

    当我们使用Laravel的php artisan migrate命令来创建或者更新数据库表时,有时候会遇到SQLSTATE[42000]的报错情况。这种情况可能是由于SQL语句不正确或者数据库连接出现错误导致。针对这种问题,我们可以从以下几个方面来进行排查和解决: 检查SQL语句语法 在使用Laravel的php artisan migrate命令时,我们需…

    database 2023年5月19日
    00
  • MySQL如何查询Binlog 生成时间

    查询MySQL的Binlog生成时间可以通过查询Binlog文件的头部信息来实现。下面是关于如何查询MySQL Binlog生成时间的完整攻略。 步骤 步骤1:登录MySQL 使用MySQL客户端,输入以下命令登录到MySQL中。 mysql -u[用户名] -p[密码] -h[MySQL服务器主机名或IP地址] 其中,[用户名]和[密码]是MySQL登录名…

    database 2023年5月22日
    00
  • 初步介绍MySQL中的集合操作

    初步介绍MySQL中的集合操作 MySQL可以进行各种集合操作,如并集、交集、差集等。这些集合操作是通过使用关键字UNION, INTERSECT, EXCEPT等来实现的。以下是集合操作的详细介绍: 一、UNION操作 使用UNION操作可以将两个或多个SELECT语句返回的结果集合并为一个结果集。UNION操作的基本语法如下: SELECT column…

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