当前位置: 首页 > news >正文

MySQL关闭sql_mode的only_full_group_by

MySQL 的 sql_mode 系统变量,简单来说,就是一套用来控制 MySQL 行为“严格程度”的规则。它决定了 MySQL 接受什么样的 SQL 语法,以及数据插入或更新时要不要进行严格的合法性检查。

sql_mode 的作用范围和配置方式如下:

作用域:它可以设置为全局(影响所有新连接),也可以设置为会话(只影响当前客户端连接)。

查看当前模式:使用 SELECT @@sql_mode; 或 SELECT @@GLOBAL.sql_mode;

运行时修改命令如下:

SET GLOBAL sql_mode = 'modes'; (需要管理权限,只影响后续新连接)

SET SESSION sql_mode = 'modes'; (只影响当前会话)

默认模式与关键选项
不同版本的 MySQL 默认值可能不同。从 MySQL 8.0 开始(到 9.7 版本),默认的 sql_mode 通常包含以下几项:

ONLY_FULL_GROUP_BY

STRICT_TRANS_TABLES

NO_ZERO_IN_DATE

NO_ZERO_DATE

ERROR_FOR_DIVISION_BY_ZERO

NO_ENGINE_SUBSTITUTION

模式 (Mode)主要作用
STRICT_TRANS_TABLES“严格模式” 的核心。当插入或更新数据不符合列的定义时(如字符串超长、类型不匹配),会直接报错并中止操作,而不是只给一个警告然后自动截断或转换。
ONLY_FULL_GROUP_BY强制 SELECT 语句中,不在 GROUP BY 子句中的非聚合列,不能出现在 SELECT 列表中。
NO_ZERO_DATE禁止使用 '0000-00-00' 作为合法的日期值。
NO_ZERO_IN_DATE禁止日期中出现零值月或日(如 '2023-00-01' 或 '2023-01-00')。
ERROR_FOR_DIVISION_BY_ZERO控制除零操作的处理。在严格模式下,除零会报错;否则返回 NULL 并给出警告。
NO_ENGINE_SUBSTITUTION当 CREATE TABLE 或 ALTER TABLE 指定的存储引擎不可用时,直接报错,而不是自动替换为默认引擎
其他除了上述,还有一些组合模式,比如 TRADITIONAL,它就像是“严格模式”的集合,让 MySQL 的行为更像传统的 SQL 数据库,对非法数据会直接报错,而不是给警告。

STRICT_TRANS_TABLES例子:

尝试将一个100字符的字符串插入到一个VARCHAR(10)列中,会直接报错,而不是被截断保存。

ONLY_FULL_GROUP_BY例子:

SELECT name, age, MAX(score) FROM students GROUP BY name; 这条语句会报错,因为 age 没有出现在 GROUP BY 中。

NO_ZERO_DATE例子:

插入 '0000-00-00' 到 DATE 类型的列会报错或警告(取决于是否在严格模式下)。

NO_ZERO_IN_DATE例子:

与严格模式结合会报错,否则可能会被转为 '0000-00-00' 并给出警告。

ERROR_FOR_DIVISION_BY_ZERO例子:

SELECT 1/0; 在严格模式下会直接报错。

NO_ENGINE_SUBSTITUTION例子:

指定 ENGINE=InnoDB,但服务器不支持,语句会失败。

配置建议
生产环境:强烈建议启用严格模式,至少包含 STRICT_TRANS_TABLES。这是保证数据质量的第一道防线,可以避免很多因为数据“悄悄”被截断或转换而引发的逻辑错误。

开发环境:为了尽早发现问题,最好能让开发环境与生产环境的 sql_mode 保持一致。如果为了调试方便,可以适当放宽,但最终上线前务必切换到严格模式。
注意事项
分区的风险:如果在创建了包含用户自定义分区的表之后,再更改 sql_mode,可能导致数据丢失或损坏。官方强烈建议,一旦创建了分区表,就不要再变更 sql_mode。

主从环境:为了数据一致性,主库和从库的 sql_mode 设置最好完全相同。

永久修改sql_mode方法(需要重启)

找到配置文件:通常是Linux下的 my.cnf 以及include相关的配置文件文件

修改配置:在 [mysqld] 部分,找到 sql_mode 这一行,将 ONLY_FULL_GROUP_BY 从列表中删除。如果没有这一行,可以自行添加。

操作建议:最好先通过 SELECT @@sql_mode; 查看当前完整的模式列表,复制出来,再删掉 ONLY_FULL_GROUP_BY 后填入配置文件,避免遗漏。
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

保存后重启mysql服务。

systemctl restart mysqld.service

http://www.jsqmd.com/news/1306124/

相关文章:

  • MAA明日方舟自动化助手:完整指南解放你的游戏时间
  • 风控越严,黑产欺诈手法越“真实”|2026年上半年信贷欺诈报告发布
  • Cocos2d-x实现《鳄鱼洗澡》核心玩法:网格化水流物理模拟与组件化架构实践
  • 电力场景输电线路杆塔植被覆盖滕蔓隐患检测数据集VOC+YOLO格式3992张2类别
  • 如何快速配置直播录制工具:3步完成多平台自动录制
  • 2026廊坊下水道疏通维修靠谱机构榜单 马桶地漏积水反臭倒灌彻底解决攻略 - 宅安选房屋修缮
  • C++字符串insert函数:从基础原理到高效应用实战
  • 千牛订单处理系统:多线程不抢焦,告别网页卡死报错
  • AI意图识别技术优化:从模型轻量化到工程实践
  • G-Helper终极指南:5分钟让你的华硕笔记本告别臃肿,性能翻倍!
  • ABAP Open SQL新语法实战:CASE、NULL处理、CAST与CDS视图应用
  • AMD Ryzen调试工具终极指南:免费开源掌控你的硬件性能
  • 一纸学历,多重可能:浙江职场人学历升级的价值重构
  • 南充刑事案件与婚姻家事律师怎么选?2026年本地法律服务机构观察 - 优质品牌商家
  • 绵阳家具选购全攻略:主流卖场横向对比与采购避坑干货 - 国麟测评
  • 2026年马耳他移民避坑指南:MPRP永居申请常见风险点与选择要点 - 资讯综合
  • 计算机二级C++备考:从应试到实战的系统性能力重塑指南
  • 如何快速掌握Detect-It-Easy:文件安全检测工具的完整指南
  • 二维坐标变换核心:平移旋转缩放镜像阵列原理与OpenCV实战
  • Godot引擎集成Spine Runtime:2D骨骼动画开发全攻略
  • 当AI遇见视频水印:三分钟让你的视频焕然一新✨
  • PHP继承实战:从访问权限到方法重写的面向对象编程精解
  • 3分钟掌握智能视频水印去除:从烦人水印到纯净画面的蜕变之旅
  • TikTok 无网络连接解决方​​法(2026 年指南):原因及解决方法
  • AMD Ryzen终极调校指南:3分钟掌握SMUDebugTool免费专业工具
  • 安徽省高职专科大二、大三应届生统招专升本辅导,库课贴合安徽考纲系统教学 - 最新资讯
  • 蓝桥杯国赛C组P12314题解:基于同余类分组的集合计数算法
  • 2026 年 8 月承德市非急救医疗转运行业发展解析及本土合规企业服务实录 - 平台推荐官
  • 德玛仕商用蒸饭车选购指南:从核心功能到现场安装全解析
  • AI Agent技术解析与实战:从原理到电商客服应用