MySQL SQL Mode及其说明

以下是MySQL中所有支持的SQL Mode及其说明,综合了多个来源的信息并进行了分类整理:

一、严格模式相关

  1. STRICT_TRANS_TABLES

    • 对事务型存储引擎(如InnoDB)启用严格数据校验。若插入非法值(如类型不符、超出范围等),语句会被中止。对于非事务表,仅当首行数据非法时中止语句。
  2. STRICT_ALL_TABLES

    • 对所有存储引擎启用严格模式。与STRICT_TRANS_TABLES的区别在于:对于多行插入的非事务表,即使后续行数据非法,也会中止整个操作(而非仅跳过非法行)。
  3. TRADITIONAL

    • 组合模式,等同于STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。行为类似传统SQL数据库,对非法数据直接报错而非警告。

二、日期与零值控制

  1. NO_ZERO_IN_DATE

    • 禁止年月日中部分为零的日期(如2025-00-01),但允许0000-00-00。需与严格模式配合生效。
  2. NO_ZERO_DATE

    • 禁止0000-00-00作为有效日期。若启用严格模式,插入该值会报错。
  3. ALLOW_INVALID_DATES

    • 宽松日期校验,仅检查月份(1-12)和日(1-31),不验证实际有效性(如允许2025-02-30)。不适用于TIMESTAMP列。

三、数学运算与类型处理

  1. ERROR_FOR_DIVISION_BY_ZERO

    • 除零或模零操作在严格模式下报错(否则返回NULL并警告)。注意:该模式在MySQL 8.0中已标记为弃用,其功能将合并到严格模式。
  2. NO_UNSIGNED_SUBTRACTION

    • 允许无符号整数减法结果为负数(默认会溢出报错)。
  3. REAL_AS_FLOAT

    • REAL类型视为FLOAT(默认视为DOUBLE)。

四、语法与标识符规则

  1. ANSI_QUOTES

    • 双引号"视为标识符引用符(如列名),而非字符串引号。需改用单引号定义字符串。
  2. IGNORE_SPACE

    • 允许函数名与括号间有空格(如COUNT (1)),但会导致函数名成为保留字需转义。
  3. PIPES_AS_CONCAT

    • ||视为字符串连接符(标准SQL行为),而非逻辑OR。
  4. HIGH_NOT_PRECEDENCE

    • 提高NOT运算符优先级(如NOT a BETWEEN b AND c解析为(NOT a) BETWEEN b AND c)。

五、GROUP BY与聚合控制

  1. ONLY_FULL_GROUP_BY
    • 严格校验GROUP BY查询,SELECT中的非聚合列必须在GROUP BY子句中出现或函数依赖。

六、引擎与存储相关

  1. NO_ENGINE_SUBSTITUTION

    • 若创建表时指定不可用的存储引擎(如未编译的引擎),直接报错而非替换为默认引擎。
  2. NO_DIR_IN_CREATE

    • 忽略建表语句中的INDEX DIRECTORYDATA DIRECTORY指令(常用于主从复制环境)。

七、其他特殊模式

  1. NO_AUTO_VALUE_ON_ZERO

    • 禁止0作为自增列的下一个值(仅NULL触发自增)。
  2. NO_BACKSLASH_ESCAPES

    • 禁用反斜杠\作为转义符(如\n视为普通字符)。
  3. PAD_CHAR_TO_FULL_LENGTH

    • 检索CHAR类型时保留右端空格(默认自动修剪)。

八、组合模式(预定义模式组)

  1. ANSI

    • 等同于REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,接近标准SQL语法。
  2. DB2/MSSQL/ORACLE/POSTGRESQL

    • 兼容其他数据库的语法组合(如PIPES_AS_CONCAT,ANSI_QUOTES等),但这些模式在MySQL 8.0中已移除。

注意事项

  • 不同MySQL版本的默认模式可能不同(如5.7默认包含ONLY_FULL_GROUP_BY和严格模式,而5.6默认宽松)。
  • 部分模式(如ERROR_FOR_DIVISION_BY_ZERO)已弃用,未来版本可能整合到严格模式中。

完整列表可参考MySQL官方文档。

相关推荐
xmjd msup22 分钟前
mysql的分区表
数据库·mysql
Lyyaoo.22 分钟前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM27 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens31 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.131 分钟前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick199340 分钟前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花8 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56619 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全10 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_7717172110 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql