向sql_mode 添加或删除模式
MySQL 5.7.9 或更高版本
要在sql_mode 中添加或删除模式,您可以使用list_add 和list_drop 函数。
要从当前 SESSION.sql_mode 中删除模式,您可以使用以下方法之一:
SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
从GLOBAL.sql_mode 中删除一个模式,该模式在当前运行时操作中持续存在,直到服务重新启动。
SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');
MySQL 5.7.8 或更低版本
由于sql_mode 值是一个CSV 模式字符串,您需要确保该字符串不包含残留逗号,这可以通过使用TRIM(BOTH ',' FROM ...) 来完成。
要从 sql_mode 变量中删除模式,您需要使用 REPLACE() 和 TRIM() 以确保删除所有残留的逗号。
SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
要向sql_mode 变量添加模式,您可能需要使用CONCAT_WS(',', ...),以确保在当前模式后附加一个逗号,并使用TRIM() 以确保删除任何残留的逗号。
SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));
注意:更改 GLOBAL 变量不会传播到 SESSION 变量,直到建立新连接。
GLOBAL 变量将持续存在,直到正在运行的服务重新启动。
SESSION 变量将持续存在于当前连接,直到连接关闭并建立新连接。
恢复为GLOBAL.sql_mode
由于SET sql_mode = 'ONLY_FULL_GROUP_BY'; 是在没有GLOBAL 修饰符的情况下执行的,因此更改仅影响当前SESSION 状态值,这也与@@sql_mode 有关。要删除它并恢复到全局服务器重启时的默认值,您需要使用来自 @@GLOBAL.sql_mode 的值。 [sic]
当前SESSION 值仅对当前连接有效。
重新连接到服务器会将值恢复为GLOBAL
价值。
要将当前会话状态值恢复为当前全局值,您可以使用以下方法之一:
SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;
将SESSION.sql_mode 值更改为ONLY_FULL_GROUP_BY
SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode | @@GLOBAL.sql_mode |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+
将SESSION.sql_mode 值还原为GLOBAL.sql_mode 值
SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode | @@GLOBAL.sql_mode |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+
服务器重启持久sql_mode使用选项文件
设置SQL mode
在服务器启动时,使用命令上的--sql-mode="modes" 选项
行,或 sql-mode="modes" 在选项文件中,例如 my.cnf(Unix
操作系统)或 my.ini (Windows)。 [sic]
请查看您的 MySQL 版本以确定支持和默认的modes。
MySQL >= 5.7.5,
[mysqld]
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
请参阅Option File Syntax 了解更多信息。
在选项文件中指定选项的语法类似于
命令行语法。但是,在选项文件中,您省略了前导
选项名称中的两个破折号,并且您只指定一个选项
线。例如,--quick 和 --host=localhost 在命令行上
应指定为 quick 和 host=localhost 在单独的行
一个选项文件。在中指定--loose-opt_name 形式的选项
一个选项文件,写成loose-opt_name。
可以选择将值括在单引号或
双引号,如果值包含#,这很有用
评论字符。
默认sql_mode 值
由于 MySQL 文档每个版本的值已被删除,因此我将它们添加到此处供您参考。
MySQL >= 8.0.11 8.0.5 - 8.0.10 Skipped
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION
MySQL >= 5.7.8,
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
MySQL 5.7.7
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION
MySQL >= 5.7.5,
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION
MySQL >= 5.6.6,
NO_ENGINE_SUBSTITUTION
MySQL
''