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日

相关文章

  • MySQL数据库实验实现简单数据库应用系统设计

    MySQL数据库实验实现简单数据库应用系统设计攻略 1. 实验目的 通过设计和实现简单的数据库应用系统,掌握MySQL数据库的基本操作和应用。 2. 实验环境 操作系统:Windows/Linux/macOS 数据库:MySQL 3. 实验步骤 3.1 数据库设计和创建 根据需求设计数据库的表结构,并在MySQL中创建对应的数据库、表和数据。 示例:创建一个…

    database 2023年5月19日
    00
  • Spring详细讲解事务失效的场景

    下面来详细讲解“Spring详细讲解事务失效的场景”的完整攻略。 什么是事务失效 在Spring中,事务失效是指在某些场景下,事务处理机制并没有生效,导致一些本应该在事务内执行的操作,如果没有异常处理机制,将不具备回滚的能力,最终导致数据异常。 事务失效的常见场景 场景一:跨方法调用导致的事务失效 在Spring中,如果在同一个类中的另一个方法调用带有@Tr…

    database 2023年5月21日
    00
  • shell 命令行中操作HBase数据库实例详解

    Shell 命令行中操作 HBase 数据库实例详解 前言 HBase 是 Apache Hadoop 生态系统中的一个基于列存储的分布式数据库,通常在大数据场景下使用,可以存储海量的数据,并提供高性能的读写操作。在 HBase 中,我们通常使用 HBase Shell 命令行进行交互式的数据操作。 本文将详细讲解在 HBase Shell 命令行中操作 H…

    database 2023年5月22日
    00
  • 编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法

    当我们在编译PHP时,可能会遇到这样一个错误信息:configure error Cannot find libmysqlclient under usr。一般情况下,这是由于缺少MySQL的库文件或未正确设置相关环境变量引起的。解决这个问题的方法很简单,请遵循以下步骤: 1. 检查MySQL是否安装 在Ubuntu或Debian等操作系统上,可以使用以下命…

    database 2023年5月22日
    00
  • 计算机二级考试MySQL知识点 mysql alter命令

    以下是关于计算机二级考试MySQL知识点mysql alter命令的完整攻略: 一、什么是mysql alter命令? MySQL中的ALTER命令用于修改已有的数据库表结构,可以对表的列、索引、约束等进行更改。 语法格式如下: ALTER TABLE table_name action; 其中,table_name是需要修改的数据库表名,action是需要…

    database 2023年5月19日
    00
  • 第五部分(二) 数据存储(关系型数据库:MySQL存储方式)

    一 关系型数据库存储关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是关系型数据库。关系型数据库有多种,如SQLite、MySQL、Orac…

    MySQL 2023年4月13日
    00
  • linux下指定mysql数据库服务器主从同步的配置实例

    下面是Linux下指定MySQL数据库服务器主从同步的配置实例的完整攻略: 概述 主从同步是MySQL中非常重要的一项功能,它可以提供高可用性和数据可靠性,使得数据的备份和恢复更加方便和快捷。 在Linux环境下,实现主从同步需要进行以下几个步骤: 在主服务器上配置MySQL服务器,开启binlog功能。 在主服务器上创建一个用于同步的用户,授权该用户对数据…

    database 2023年5月22日
    00
  • mysql 存储过程详解

    MySQL 存储过程详解 什么是 MySQL 存储过程 MySQL 存储过程是一种可以存储在 MySQL 数据库中的一组 SQL 语句,它们可以在需要时被多次调用。这些 SQL 语句被组织在一起并赋予一个名字,以便在需要时可以轻松地执行它们。 MySQL 存储过程通常用于封装特定的功能模块。通过使用存储过程,可以简化代码,提高代码的可重用性和可维护性,并提高…

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