关于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创建存储过程(CREATE PROCEDURE)

    MySQL创建存储过程的方法: 在MySQL中创建存储过程需要使用CREATE PROCEDURE语句,并指定存储过程的名称; 设置存储过程的参数、返回值、执行体等信息; 使用END语句来结束存储过程。 MySQL创建存储过程的示例: 如下片段是创建一个简单的 MySQL 存储过程的示例: DELIMITER // CREATE PROCEDURE get_…

    MySQL 2023年3月10日
    00
  • mysql服务1067错误多种解决方案分享

    标题:MySQL服务1067错误多种解决方案分享 MySQL服务经常会出现1067错误,该错误提示通常为“错误1067:进程意外终止”,这意味着MySQL服务无法启动,导致数据库无法正常使用。本文将分享多种解决方案,帮助读者快速解决MySQL服务1067错误。 解决方案一:检查my.ini配置文件 打开my.ini文件所在目录,在Windows下一般为C:\…

    MySQL 2023年5月18日
    00
  • MySQL8.0中Online DDL也要在业务低峰期执行

    一、背景 MySQL从5.6开始引入了Online DDL,alter操作不再阻塞dml。在MySQL 8.0中,针对Online DDL做了进一步优化,alter table加列操作支持INSTANT算法,意思就是使用这个算法进行加列操作只需要修改表的元数据信息,操作瞬间就完成了。在MySQL 8.0.30以后,instant算法支持加列加到表的任一位置,…

    MySQL 2023年4月25日
    00
  • MySQL外键创建失败1005原因汇总

    下面是关于MySQL外键创建失败1005的完整攻略: 一、问题背景 在使用MySQL时,我们常常会遇到外键创建失败的问题,错误码为1005。该问题可能会由多个因素引起,下面将对可能引起该问题的原因进行一一讲解,并提供解决该问题的方法。 二、可能的原因 约束名字已经存在 在创建外键时,如果你给该外键指定了一个约束名字,而该约束名字已经被使用过了,那么会导致外键…

    MySQL 2023年5月18日
    00
  • MySQL之mysqldump数据备份还原

    一 mysqldump指令实现数据备份、mysql指令实现数据还原  经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。DBA的核心目标是保…

    MySQL 2023年4月16日
    00
  • MySQL ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO) 的原因分解决办法

    这里我来详细讲解MySQL ERROR 1045 (28000)的原因分解决办法。首先,让我们来看看这个错误提示的含义: MySQL ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO) 这个错误提示通常表示在连接MySQL数据库时,使用的用户名或…

    MySQL 2023年5月18日
    00
  • 在阿里云的CentOS环境中安装配置MySQL的教程

    下面是在阿里云的CentOS环境中安装配置MySQL的完整攻略: 1. 安装MySQL Step 1: 打开终端或SSH工具,以root身份登录CentOS系统的命令行界面; Step 2: 输入以下命令安装MySQL: yum install mysql-server Step 3: 安装MySQL后,输入以下命令启动MySQL服务: service my…

    MySQL 2023年5月18日
    00
  • 将MySQL去重操作优化到极致的操作方法

    下面是详细讲解将MySQL去重操作优化到极致的操作方法的完整攻略。 1. 针对单表的去重操作 1.1 利用DISTINCT关键字 在MySQL中,可以使用DISTINCT关键字实现对单表去重操作。例如,以下SQL语句可以筛选出表table1中name列不重复的记录: SELECT DISTINCT name FROM table1; 1.2 利用GROUP …

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