SQL Mode 是 MySQL 中一个重要的系统变量,它决定了 MySQL 应遵循的 SQL 语法规则和数据验证规则。
什么是 SQL Mode
SQL Mode 定义了 MySQL 应该支持的 SQL 语法以及执行数据验证的方式。通过设置不同的 SQL Mode,可以让 MySQL 在不同程度上兼容其他数据库系统,或者启用更严格的数据检查。
查看当前 SQL Mode
SELECT @@GLOBAL.sql_mode; -- 查看全局 SQL Mode
SELECT @@SESSION.sql_mode; -- 查看当前会话的 SQL Mode
常见的 SQL Mode 选项
-
STRICT_TRANS_TABLES
对事务表启用严格模式,非法数据值会导致错误而非警告 -
STRICT_ALL_TABLES
对所有表启用严格模式 -
NO_ZERO_IN_DATE
禁止日期中的月份或日部分为零(如 '2023-00-01') -
NO_ZERO_DATE
禁止 '0000-00-00' 作为有效日期 -
ERROR_FOR_DIVISION_BY_ZERO
除零操作产生错误而非 NULL -
ONLY_FULL_GROUP_BY
要求 GROUP BY 子句包含所有非聚合列 -
ANSI_QUOTES
将双引号视为标识符引用符(类似标准 SQL) -
PIPES_AS_CONCAT
将||
视为字符串连接符而非 OR 运算符 -
NO_AUTO_CREATE_USER
禁止 GRANT 自动创建用户 -
NO_ENGINE_SUBSTITUTION
当指定存储引擎不可用时产生错误而非自动替换
常用的 SQL Mode 组合
-
传统模式 (TRADITIONAL)
等同于:STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
-
ANSI 模式
等同于:REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
-
严格模式 (STRICT)
等同于:STRICT_TRANS_TABLES, STRICT_ALL_TABLES
设置 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_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-
动态设置(当前会话):
SET SESSION sql_mode = 'mode1,mode2,...';
-
动态设置(全局):
SET GLOBAL sql_mode = 'mode1,mode2,...';
SQL Mode 的重要性
正确设置 SQL Mode 可以:
-
提高数据完整性
-
确保与其他数据库系统的兼容性
-
防止不良数据插入
-
使 MySQL 行为更符合标准 SQL
在生产环境中,通常建议使用严格模式(TRADITIONAL)以确保数据质量。