关于MySQL的sql_mode合理设置详解

关于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 — 单行函数

      大小写控制函数 SELECT LOWER(‘HelloWrold’), UPPER(‘HelloWorld’);   字符控制函数 SELECT REPLACE(‘abcdababab’,’p’,’m’); 将“abcdababab”中的字符p替换成m;   SELECT TRIM(‘ ‘ FROM ‘ HHHHHello.HHHWorldHHHHH ‘…

    MySQL 2023年4月13日
    00
  • MySQL使用DROP TABLE命令删除表怎么恢复?

    前言 今天同事勿删除了一个测试环境表,因为刚好在跑重要的数据,重新跑又比较麻烦,所以尝试看能不能通过恢复数据的方式进行数据恢复,如果你也是重要数据一定要切记“不要慌,慌也没用”。百度过一些例子,哪些例子比较适合表刚刚创建后被删除,就能完全恢复,本篇文章适合那种创建很长时间,表在被删除的。 开始操作 第一步:先连接数据库 mysql -uroot 第二步:在M…

    MySQL 2023年4月17日
    00
  • Mysql排序的特性详情

    MySQL排序是指对数据进行按照指定的字段或条件进行排序,以方便数据查询和展示。下面我们将详细讲解MySQL排序的特性详情: 排序的基本语法 MySQL排序语法如下: SELECT column1, column2, … FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], … …

    MySQL 2023年5月19日
    00
  • MySQL中出现乱码问题的终极解决宝典

    MySQL中出现乱码问题的终极解决宝典 背景 在使用MySQL进行数据存储和读取的过程中,经常会遇到中文乱码的问题。这种问题不仅影响数据的可读性,还可能导致数据的丢失或变形。因此,解决MySQL中出现乱码问题是非常重要的一项技能。 原因 MySQL中出现乱码的原因可能有很多,其中常见的原因包括: 数据库字符集不匹配。 数据库连接字符集设置不正确。 应用程序在…

    MySQL 2023年5月18日
    00
  • MySQL数据库误操作后快速回滚的方法

    下面是详细讲解MySQL数据库误操作后快速回滚的方法的攻略: 1. 概述 MySQL是一款常用的关系型数据库系统。在使用MySQL过程中,偶尔会发生误操作,比如删除错误的数据、修改错误的数据等,这些误操作可能会对数据库造成严重的影响。如果没有备份,将会带来无法挽回的后果。因此,本文将介绍一些MySQL数据库误操作后快速回滚的方法,以防止误操作对数据库造成的影…

    MySQL 2023年5月18日
    00
  • MySQL四种日志binlog/redolog/relaylog/undolog

    优质博文:IT-BLOG-CN 一、binlog binlog记录数据库表结构和表数据变更,比如update/delete/insert/truncate/create,它不会记录select。存储着每条变更的SQL语句和XID事务Id等等。binlog日志文件如下: [root@192.168.10.11]# mysqlbinlog mysql-binlo…

    2023年4月8日
    00
  • 如何使用分区处理MySQL的亿级数据优化

    如何使用分区处理MySQL的亿级数据优化 1. 什么是分区 在 MySQL 中,分区是一种数据划分技术。通过将数据分散到多个分区表中,可以在查询时快速定位需要的数据,提升查询效率。常见的分区方式有按范围分区、按列表分区、按哈希分区等。分区表的表结构与普通表相同,只是需要在表创建时指定分区方式和分区键。 2. 分区的优势 分区表与普通表相比,有以下优势: 快速…

    MySQL 2023年5月19日
    00
  • 异常: Unable to determine the provider name for provider factory of type ‘MySql.Data.MySqlClient.MySqlClientFactory’.

      报错信息: 异常: Unable to determine the provider name for provider factory of type ‘MySql.Data.MySqlClient.MySqlClientFactory’. Make sure that the ADO.NET provider is installed or regi…

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