session sql模式+默认sql模式

Chr*_*nch 2 mysql mysql-5.7

我正在 mysql 5.7 中测试我的应用程序,并且有一些代码不适用于 ONLY_FULL_GROUP_BY ON。我会在以后的版本中修复这个问题。我找到了一种方法,通过在运行任何查询之前执行 'SET SESSION sql_mode=""' 来为我的应用程序关闭此功能。

我有两个问题:

  1. 这是否适用于对数据库没有 root 访问权限的共享主机服务?它似乎对我的测试有效。

  2. 由于模式设置为 '' 这实际上意味着什么?对我来说,这似乎是将其设置为无,并且不受限制。(我的另一个想法是它将它设置为空,让 mysql 决定做什么)。

根据我对手动空模式的阅读,mysql 5.1 中默认使用手动空模式,但每个版本都变得更加严格。对于 mysql 5.7,它是ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION.

因此,基于此,模式似乎是一个规则列表,如果它为空,则规则是否适用?

另外,如果我将模式设置为“”,这将始终禁用服务器设置的模式吗?

Ric*_*mes 5

  • SET SESSION变量适用于当前连接。
  • SET GLOBAL建立连接时,变量应用为默认值
  • SESSION不需要root访问;GLOBAL做。
  • 请注意您将其设置为:

假设您发现默认值是

mysql> SELECT @@sql_mode;
+--------------------------------+
| @@sql_mode                     |
+--------------------------------+
| STRICT_ALL_TABLES,NO_ZERO_DATE |
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

盲目设置它会在设置你想要的一个时关闭这两个:

mysql> set session sql_mode = 'ONLY_FULL_GROUP_BY';
mysql> SELECT @@sql_mode;
+--------------------+
| @@sql_mode         |
+--------------------+
| ONLY_FULL_GROUP_BY |
+--------------------+
Run Code Online (Sandbox Code Playgroud)

因此,构建完整的字符串:

mysql> SET sql_mode = 'NO_ZERO_DATE,STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY';

mysql> SELECT @@sql_mode;
+---------------------------------------------------+
| @@sql_mode                                        |
+---------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_ALL_TABLES,NO_ZERO_DATE |
+---------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

附加物

如果您想在不知道已经设置了哪些模式的情况下添加/减去模式,这似乎有效:

打开(仅适用于会话):

SET @@sql_mode = CONCAT(@@sql_mode, ',', 'ONLY_FULL_GROUP_BY');
Run Code Online (Sandbox Code Playgroud)

关闭(仅适用于会话):

SET @@sql_mode =
        REPLACE(
        REPLACE(
        REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY,', ''),
                           ',ONLY_FULL_GROUP_BY', ''),
                            'ONLY_FULL_GROUP_BY', '');
Run Code Online (Sandbox Code Playgroud)

仔细注意逗号。