我正在 mysql 5.7 中测试我的应用程序,并且有一些代码不适用于 ONLY_FULL_GROUP_BY ON。我会在以后的版本中修复这个问题。我找到了一种方法,通过在运行任何查询之前执行 'SET SESSION sql_mode=""' 来为我的应用程序关闭此功能。
我有两个问题:
这是否适用于对数据库没有 root 访问权限的共享主机服务?它似乎对我的测试有效。
由于模式设置为 '' 这实际上意味着什么?对我来说,这似乎是将其设置为无,并且不受限制。(我的另一个想法是它将它设置为空,让 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
.
因此,基于此,模式似乎是一个规则列表,如果它为空,则规则是否适用?
另外,如果我将模式设置为“”,这将始终禁用服务器设置的模式吗?
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)
仔细注意逗号。