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 |
创建表时,如果指定的存储引擎不可用,将报错而不是使用默认引擎。有助于避免隐式行为。推荐开启。 |