MySQL 8 的默认 sql_mode 包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group_by;
全局修改则使用以下sql
-- 全局配置 session级配置则去掉Global
SET GLOBAL sql_mode='ANSI_QUOTES,STRICT_ALL_TABLES,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SELECT @@GLOBAL.sql_mode; -- 查看全局设置
SELECT @@SESSION.sql_mode; -- 查看会话级设置
在 MySQL 中,sql_mode
是一个系统变量,用于定义 MySQL 服务器的 SQL 语法和数据校验的行为。MySQL 支持多种 sql_mode
值,这些值可以单独设置,也可以组合使用。然而,由于 MySQL 的版本更新和功能的增加,sql_mode
的具体值可能会有所变化。以下是一些常见的 sql_mode
值,但请注意这并不是一个完整的列表,因为 MySQL 可能会在未来的版本中引入新的 sql_mode
值。
常见的 sql_mode
值
- STRICT_TRANS_TABLES
- 启用严格模式,对非事务性存储引擎(如 MyISAM)也应用严格的数据校验。在严格模式下,如果插入或更新的数据不符合列的数据类型或约束条件,MySQL 将拒绝执行并返回错误。
- STRICT_ALL_TABLES
- 类似于
STRICT_TRANS_TABLES
,但对所有存储引擎都应用严格的数据校验。
- 类似于
- NO_ZERO_IN_DATE
- 不允许日期和月份部分为 0 的日期值(如 '2023-00-01')。
- NO_ZERO_DATE
- 不允许日期值为 '0000-00-00'。
- ALLOW_INVALID_DATES
- 允许插入无效的日期值(如 '2023-02-30'),但通常不推荐使用此模式,因为它可能会导致数据不一致。
- ERROR_FOR_DIVISION_BY_ZERO
- 在除法运算中,如果除数为零,则产生错误而不是返回 NULL。
- NO_AUTO_CREATE_USER
- 禁止 GRANT 语句自动创建新用户,如果新用户不存在,则 GRANT 语句将失败。请注意,在 MySQL 8.0 中,这个
sql_mode
值可能已经被移除或不再使用。
- 禁止 GRANT 语句自动创建新用户,如果新用户不存在,则 GRANT 语句将失败。请注意,在 MySQL 8.0 中,这个
- NO_ENGINE_SUBSTITUTION
- 如果创建表时指定的存储引擎被禁用或未编译,则拒绝创建表。
- PIPES_AS_CONCAT
- 将 '||' 用作字符串连接操作符,而不是逻辑 OR 操作符。这更符合一些其他数据库系统的行为。
- ANSI_QUOTES
- 将双引号(")视为标识符引用字符,而不是字符串字面量的定界符。这有助于与 ANSI SQL 标准保持一致。
- ONLY_FULL_GROUP_BY
- 启用此模式后,
SELECT
列表、HAVING
条件和ORDER BY
列表中的列必须明确地包含在GROUP BY
子句中,或者被聚合函数包围。这有助于防止意外的查询结果。
- 启用此模式后,
注意
-
由于 MySQL 的版本更新,某些
sql_mode
值可能已被移除、更名或行为发生变化。 -
默认情况下,MySQL 8.0 的
sql_mode
可能包括ONLY_FULL_GROUP_BY
、STRICT_TRANS_TABLES
、NO_ZERO_IN_DATE
、NO_ZERO_DATE
、ERROR_FOR_DIVISION_BY_ZERO
和NO_ENGINE_SUBSTITUTION
等值,但具体值可能因安装和配置而异。 -
要查看当前 MySQL 服务器的
sql_mode
设置,可以使用SELECT @@GLOBAL.sql_mode;
(查看全局设置)或SELECT @@SESSION.sql_mode;
(查看会话级设置)命令。 -
修改
sql_mode
可以在 MySQL 的配置文件(如my.cnf
或my.ini
)中设置,也可以在 MySQL 会话中动态地设置(使用SET GLOBAL
或SET SESSION
命令)。但是,请注意,动态修改全局sql_mode
需要具有足够的权限,并且新设置的值将在新的会话中生效,而不影响当前已存在的会话。
以下是MySQL中一些常见的sql_mode
值,这些值可以单独使用或组合使用来定义MySQL服务器的SQL语法和数据校验行为: -
STRICT_TRANS_TABLES
-
STRICT_ALL_TABLES
-
NO_ZERO_IN_DATE
-
NO_ZERO_DATE
-
ALLOW_INVALID_DATES
-
ERROR_FOR_DIVISION_BY_ZERO
-
NO_AUTO_CREATE_USER
(注意:在MySQL 8.0中可能已被移除或不再使用) -
NO_ENGINE_SUBSTITUTION
-
PIPES_AS_CONCAT
-
ANSI_QUOTES
-
IGNORE_SPACE
-
NO_BACKSLASH_ESCAPES
-
NO_UNSIGNED_SUBTRACTION
-
PAD_CHAR_TO_FULL_LENGTH
-
NO_DIR_IN_CREATE
-
REAL_AS_FLOAT
-
ANSI
-
TRADITIONAL
-
ONLY_FULL_GROUP_BY
请注意,这并非一个完整的列表,因为MySQL可能在不同版本中引入新的 sql_mode
值或修改现有值的行为。此外,由于MySQL的灵活性和可配置性,某些 sql_mode
值可能在不同安装或配置中默认启用或禁用。