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日

相关文章

  • 使用Redis缓存时高效的批量删除的几种方案

    使用Redis缓存时,批量删除是一个常见的需求。下面介绍几种可以高效删除Redis缓存的方案。 使用Redis的pipeline批量删除 Redis的pipeline是一种批量执行操作的技术。对于批量删除,可以将需要删除的key全部添加到pipeline中,使用一次pipeline执行删除操作,以提高删除效率。 代码示例: import redis # 创建…

    database 2023年5月22日
    00
  • 第47月第25天 Executing test client: couldn’t execute “src/redis-benchmark”: no such file or directory.

    1. 一. mac下redis的安装 1. 官网http://redis.io/ 下载最新的稳定版本,这里是5.0.9 2. sudo mv 到 /usr/local/ 3. sudo tar -zxf redis-5.0.9.tar 解压文件 4. 进入解压后的目录 cd redis-5.0.9 5. sudo make test 测试编译 6. sudo…

    Redis 2023年4月16日
    00
  • Oracle中RAISE异常深入分析

    Oracle中RAISE异常深入分析 在Oracle数据库中,我们可以使用RAISE语句抛出异常,以便通过异常处理程序进行处理。本文将对RAISE异常进行深入分析,包括其中的参数及常用场景。 RAISE语句 RAISE语句用于向异常处理程序中抛出异常。 语法: RAISE exception_name [USING message]; 参数说明: excep…

    database 2023年5月21日
    00
  • ORACLE出现错误1033和错误ORA-00600的解决方法

    ORACLE出现错误1033和错误ORA-00600的解决方法 错误1033的解决方法 当我们在使用Oracle数据库的时候,可能会遇到错误1033。错误1033的提示信息如下所示: ORA-01033: ORACLE initialization or shutdown in progress 这个错误信息常常在连接数据库的时候出现。出现这个错误的原因是因…

    database 2023年5月19日
    00
  • 解析MySQL设置当前时间为默认值的方法

    当我们创建MySQL表时,有时候我们需要将某个字段的默认值设置为当前时间。可以通过以下两种方法来实现: 1. 使用TIMESTAMP类型 在创建表的时候,可以将字段类型设置为TIMESTAMP,并将默认值设置为CURRENT_TIMESTAMP。示例代码如下: CREATE TABLE test ( id INT, create_time TIMESTAMP…

    database 2023年5月22日
    00
  • mysql增量备份及断点恢复脚本实例

    MySQL增量备份是在全量备份的基础上,备份每次更新、修改、新增的数据,以达到备份数据更加实时的目的。下面为大家介绍MySQL增量备份及断点恢复的脚本实例。 增量备份 概述 增量备份分为两个步骤: 导出全量备份; 将全量备份时间到现在更新的数据备份。 全量备份 在Linux系统下,使用mysqldump命令进行备份。命令如下: # mysqldump -h主…

    database 2023年5月22日
    00
  • Oracle 11g2的监听器配置教程

    当您安装Oracle 11g2数据库之后,要想让客户端能够与该数据库之间进行通信,就必须启用数据库的监听器服务并对其进行正确的配置。下面就是Oracle 11g2的监听器配置教程的完整攻略: 步骤1:检查监听器服务是否已启用 在命令行窗口中运行以下命令来检查您的数据库是否已启用监听器服务: lsnrctl status 如果该服务已启用,那么命令行窗口应该会…

    database 2023年5月22日
    00
  • mysql的启动

    1。直接用mysqld手工启动 [root@ora11g bin]# ./mysqld –defaults-file=../my.cnf 140328 10:04:37 [ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysql…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部