MySQL 8 默认的sql-mode 参数

[mysqld]
sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
general_log=on
general_log_file=/www/server/data/mysql-query.log

它们共同确保:

  • SQL 行为符合预期,避免“模糊语义”
  • 插入/更新的数据更加规范和安全
  • 可帮助快速暴露数据错误或代码疏漏

下面是每个模式的说明和影响:


模式名 说明
ONLY_FULL_GROUP_BY 要求 GROUP BY 查询中,SELECT 的字段必须在 GROUP BY 中,或用于聚合函数。避免不确定的聚合行为。推荐开启。
STRICT_TRANS_TABLES 在支持事务的存储引擎(如 InnoDB)中,对非法或丢失的数据拒绝插入,而不是进行隐式截断或默认处理。提高数据质量。推荐开启。
NO_ZERO_IN_DATE 禁止日期中出现月或日为 0(如 2025-00-10)。可防止伪日期。推荐开启。
NO_ZERO_DATE 禁止使用 '0000-00-00' 作为日期。可避免非标准日期。推荐开启。
ERROR_FOR_DIVISION_BY_ZERO 对除以零的操作直接抛出错误,而不是返回 NULL 或警告。推荐开启。
NO_ENGINE_SUBSTITUTION 创建表时,如果指定的存储引擎不可用,将报错而不是使用默认引擎。有助于避免隐式行为。推荐开启。