MySQL sql_mode的使用详解

2023-12-07数据库
146

我们来讲解一下MySQL sql_mode的使用。

什么是MySQL sql_mode

MySQL sql_mode 是 MySQL 提供的一种配置,用于控制 MySQL 在执行 SQL 语句时的行为。它定义了一组规则,来判断 SQL 语句是否合法,以及如何处理 SQL 语句中的错误。

MySQL sql_mode 常见的取值

1. STRICT_TRANS_TABLES

  • 描述:在严格模式下,如果有任何非法数据插入到一个事务表中,就会报错并回滚事务。
  • 取值:STRICT_TRANS_TABLES 或者不指定。
  • 示例:创建一张名为 mytable 的表,包含一个整数类型的列 id 和一个字符串类型的列 name,同时设置 STRICT_TRANS_TABLES 模式。
    ```
    CREATE TABLE mytable (
    id INT NOT NULL,
    name VARCHAR(10) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET sql_mode = 'STRICT_TRANS_TABLES';
INSERT INTO mytable (id, name) VALUES ('1', 'MySQL');
```

2. STRICT_ALL_TABLES

  • 描述:在严格模式下,所有插入到表中的非法数据都会报错。
  • 取值:STRICT_ALL_TABLES 或者不指定。
  • 示例:创建一张名为 mytable 的表,包含一个整数类型的列 id 和一个字符串类型的列 name,同时设置 STRICT_ALL_TABLES 模式。
    ```
    CREATE TABLE mytable (
    id INT NOT NULL,
    name VARCHAR(10) NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SET sql_mode = 'STRICT_ALL_TABLES';
INSERT INTO mytable (id, name) VALUES ('1', 'MySQL');
```

3. ANSI_QUOTES

  • 描述:启用后,所有使用双引号的字符串被视为标识符,而不是字符串,因此必须使用反引号来转义标识符。
  • 取值:ANSI_QUOTES 或者不指定。
  • 示例:创建一个名为 "mytable" 的表,并设置 ANSI_QUOTES 模式。
    SET sql_mode = 'ANSI_QUOTES';
    CREATE TABLE "mytable" (
    "id" INT NOT NULL PRIMARY KEY,
    "name" VARCHAR(10) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

MySQL sql_mode 的设置方法

1. 设置全局 sql_mode

在 MySQL 配置文件 my.cnf 或者 my.ini 中,通过设置 sql_mode 的值来控制 MySQL 的 sql_mode 行为。例如:

[mysqld]
...
sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'

设置完毕后,需要重启 MySQL 服务,才能生效。

2. 设置会话级别 sql_mode

使用以下 SQL 语句,来设置会话级别 sql_mode:

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

在这个会话中,所有的 SQL 语句都会遵循这个 sql_mode 规则。如果需要恢复原来的 sql_mode 值,可以使用以下命令:

SET sql_mode = '';

总结

MySQL sql_mode 可以帮助我们避免在 SQL 语句执行时遇到一些意料之外的坑,提高了数据的完整性。

推荐在开发过程中启用 sql_mode,尽量在生产环境中也开启,尤其对于重要数据的表格,例如账户、财务数据等,更应开启sql_mode来增强数据的安全性。

The End

相关推荐

liunx mysql root账户提示:Your password has expired. To log in yo
liunx mysql root账户提示:Your password has expired. To log in you must change it using a client that supports expired passwords,要怎么操作呢? 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动...
2024-12-24 数据库
149

快速解决PostgreSQL中的Permission denied问题
下面是针对PostgreSQL中的权限问题的完整攻略。...
2023-12-07 数据库
3413

MySQL时间类型和模式详情
MySQL是一种流行的关系型数据库系统,它提供了多种时间类型和模式,用于存储和处理时间数据。本文将详细介绍MySQL时间类型和模式的详细攻略。...
2023-12-07 数据库
15

VMware中安装CentOS7(设置静态IP地址)并通过docker容器安装mySql数据库(超详细教程)
首先在官网下载CentOS7镜像,并在VMware虚拟机中新建一台CentOS7虚拟机,将镜像挂载到虚拟机中并启动。...
2023-12-07 数据库
11

SpringBoot项目报错:”Error starting ApplicationContext̷
首先,当我们使用Spring Boot开发项目时,可能会遇到Error starting ApplicationContext错误,一般这种错误是由于配置文件、依赖包或者代码逻辑等原因引起的。下面我将提供一条包含两条详细示例说明的完整攻略,用来解决上述问题。...
2023-12-07 数据库
489

Postgresql 赋予用户权限和撤销权限的实例
下面我将详细讲解如何为PostgreSQL数据库中的用户授予权限和撤销权限,包括两个实例。...
2023-12-07 数据库
30