sql_mode
一、介绍
sql_mode
是 MySQL 用于控制 SQL 语法行为和数据校验规则的一个系统变量。它会影响:
-
插入非法或不完整数据时是否报错
-
GROUP BY
的严格性 -
日期和时间的处理方式
-
是否允许
NULL
自动转换为0
等
二、查看当前的 sql_mode
SELECT @@sql_mode;
三、 设置 sql_mode
(1)
临时设置(当前会话):
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO';
(2)永久设置(修改配置文件):
编辑 MySQL 配置文件(如 /etc/my.cnf
或 my.ini
):
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO
四、常见的 sql_mode
选项
模式名 | 作用 |
---|---|
STRICT_TRANS_TABLES | 严格模式,非法数据插入会报错 |
NO_ZERO_IN_DATE | 禁止日期中出现零值(如 2025-00-15 ) |
NO_ZERO_DATE | 禁止日期完全为零(如 0000-00-00 ) |
ONLY_FULL_GROUP_BY | GROUP BY 必须包含所有未聚合字段 |
ERROR_FOR_DIVISION_BY_ZERO | 除以 0 会报错(非 NULL) |
NO_ENGINE_SUBSTITUTION | 如果存储引擎无效则报错 |
ANSI_QUOTES | 把双引号当作标识符而非字符串 |
✅ 建议设置(适用于生产环境)
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO