关于MySQL的sql_mode合理设置详解

yizhihongxing

关于MySQL的SQL_MODE合理设置详解,我会为你提供一份完整的攻略,并结合两条示例进行说明。

什么是SQL_MODE

SQL_MODE是MySQL中一个重要的配置参数,用于控制SQL语句的规范性和严谨性。它包括了许多不同的选项(模式),每个选项代表一种不同的SQL语法约束,通过指定不同的SQL_MODE可以切换MySQL对SQL语法的严格检测程度,以便更好地满足不同场景下的需求。如果你的SQL_MODE被设置为非标准模式,那么可能会导致一些 SQL 语句在执行时产生意料之外的结果。

SQL_MODE常见选项及含义

以下是SQL_MODE中最常用的一些选项及其含义:

  • STRICT_TRANS_TABLES:启用严格模式,如果插入数据时发现数据类型不对或者超过字段定义的长度,则会抛出错误。
  • STRICT_ALL_TABLES:启用所有严格模式,包括 STRICT_TRANS_TABLES 和 STRICT_GROUP_BY。
  • NO_ENGINE_SUBSTITUTION:禁止用别的存储引擎代替,如果要使用的存储引擎不可用,则直接抛出错误。
  • ONLY_FULL_GROUP_BY:启用严格模式下的 GROUP BY,表示在 GROUP BY 子句中除了 SELECT 语句列明确列出的列外,不能再添加其他不明确列明确列出。

SQL_MODE设置

可以通过以下方式来设置SQL_MODE:

  • 全局设置:在 my.cnf 文件的 [mysqld] 部分添加一条 SQL_MODE=XXX。
  • 临时会话设置:使用SET语句临时更改 SQL_MODE。
  • 用户级别设置:在用户的 MySQL 配置文件中(如~/.my.cnf)添加一条 SQL_MODE=XXX。

以下是SQL_MODE设置的两个例子:

例一:禁止隐式转换

在MySQL中,当使用字符串和数字进行比较的时候,MySQL会自动将字符串转换成数字,但是这种隐式转换会导致结果不准确。如果设置了 SQL_MODE=STRICT_TRANS_TABLES,MySQL会抛出错误,所以我们需要将SQL_MODE设置为 NO_AUTO_CREATE_USER。

mysql> SELECT '1' + 2;
+-------+
| '1' + 2 |
+-------+
|       3 |
+-------+

mysql> SET SQL_MODE=NO_AUTO_CREATE_USER;

mysql> SELECT '1' + 2;
+-------+
| '1' + 2 |
+-------+
|       3 |
+-------+

例二:禁止不明确的GROUP BY

在MySQL中,如果没有明确指定GROUP BY的列,会默认GROUP BY所有列。但是,这种行为可能导致GROUP BY结果的不确定性。例如:

mysql> SELECT name, COUNT(*) FROM users GROUP BY name;

此时MySQL并不清楚要归类哪些name相同的行,这时若开启ONLY_FULL_GROUP_BY模式,则会抛出如下错误:

ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list 
contains nonaggregated column 'test.users.name'; this is incompatible with sql_mode=only_full_group_by

所以,我们需要将SQL_MODE设置成ONLY_FULL_GROUP_BY:

mysql> SET SQL_MODE=ONLY_FULL_GROUP_BY;

这样一来,如果查询语句中的GROUP BY列不明确,就会直接报错,防止意外情况的发生。

以上就是“关于MySQL的SQL_MODE合理设置详解”攻略的完整内容,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MySQL的sql_mode合理设置详解 - Python技术站

(1)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • MySQL 一则慢日志监控误报的问题分析与解决

    MySQL 一则慢日志监控误报的问题分析与解决 背景 MySQL 的慢查询日志可以提供 SQL 查询的性能指标,帮助我们找到系统中存在的性能问题。但是,在使用慢日志监控工具时,可能会遇到一些误报问题,比如有些 SQL 语句的执行时间超过了阈值,但是实际上它们并没有成为系统的瓶颈。本文将对这类问题进行分析,并提供解决方案。 问题分析 慢查询日志的误报一般是由于…

    MySQL 2023年5月18日
    00
  • mysql 性能的检查和调优方法

    MySQL 是目前应用广泛的关系型数据库之一。在使用 MySQL 数据库时,为了保证其性能、稳定性和安全性,我们需要进行性能检查和调优。下面是 MySQL 性能检查和调优方法的完整攻略。 一、性能检查 1.1 检查 MySQL 的配置参数 我们可以使用 MySQL 提供的 SHOW VARIABLES 命令来查询 MySQL 配置参数。通过比对当前参数值和建…

    MySQL 2023年5月18日
    00
  • MySQL事务与并发控制的知识点有哪些

    这篇文章主要介绍了MySQL事务与并发控制的知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL事务与并发控制的知识点有哪些文章都会有所收获,下面我们一起来看看吧。 事务 概念 一个事务可以理解为一组操作,这一组操作要么全部执行,要么全部不执行。 特性 Read Uncommit Read Commit Repe…

    2023年4月8日
    00
  • Mysql Online DDL的使用详解

    Mysql Online DDL的使用详解 Mysql Online DDL是mysql的一个非常重要的特性,允许用户在不停止数据库服务的情况下修改数据库表结构。在这篇文章中,我们将会详细讲解mysql online ddl的使用方法,包括如何创建、修改和删除表的字段等。 创建新表 使用Mysql Online DDL,您可以创建新表,而无需停止数据库服务。…

    MySQL 2023年5月19日
    00
  • MYSQL中的时间类型

    时间上总共有五中表示方法:它们分别是 time、date、datetime、timestamp和year。 time :  “hh:mm:ss”格式表示的时间值,格式显示TIME值,但允许使用字符串或数字为TIME列分配值。date :  “yyyy-mm-dd”格式表示的日期值 ,以’HH:MM:SS’格式显示TIME值,但允许使用字符串或数字为TIME列…

    MySQL 2023年4月16日
    00
  • Mysql优化技巧之Limit查询的优化分析

    下面是关于Mysql优化技巧之Limit查询的优化分析的完整攻略。 1. 为什么需要对Limit查询进行优化 在实际应用开发中,我们常常需要进行分页查询,而Mysql提供了LIMIT语句来解决分页查询的问题,但是如果我们的数据量非常大时,就需要进行Limit查询的优化,否则会对Mysql服务器的性能产生很大的影响。 2. Limit查询的优化分析 针对Lim…

    MySQL 2023年5月19日
    00
  • mysql利用覆盖索引避免回表优化查询

    MySQL中的覆盖索引是指当我们查询的结果可以直接从索引中获取,而不需要再去查询数据表中其他的列时,就可以利用覆盖索引来避免回表操作,从而优化查询操作的效率,提升整个系统的性能。 以下是基本的步骤: 创建合适的索引:通过EXPLAIN命令分析查询语句,检查是否使用了索引,如果没有,则需要创建合适的索引。 包含所有必需列的索引:确保创建的索引包含所有SELEC…

    MySQL 2023年5月19日
    00
  • MySQL自动编号与主键

    1、自动编号(AUTO_INCREMENT),必须与主键组合使用 默认情况下,起始值为1,增量也为1。 2、主键(PRIMARY KEY) 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为NOT NULL 3、AUTO_INCREMENT必须与主键一起使用,主键不一定必须与AUTO_INCREMENT一起使用。 mysql> CREATE …

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