我正在MySQL5.7中测试我的应用程序,并且有一些与ONLY_FULL_GROUP_BY不兼容的代码。我将在稍后的版本中解决这个问题。我找到了一种在运行任何查询之前执行“SET SESSION sql_mode=”来关闭应用程序的方法。
我有两个问题:
根据我对手动空模式的阅读,MySQL5.1中使用默认的空模式,但是每个版本的限制都变得更严格了。对于MySQL5.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。
基于此,模式似乎是规则的列表,如果它是空的,那么规则适用吗?
另外,如果我将模式设置为"“,这会始终禁用服务器设置的模式吗?
发布于 2015-08-31 19:34:06
SET SESSION变量仅适用于当前连接。SET GLOBAL变量作为默认变量应用。SESSION不需要root访问;GLOBAL需要访问。假设您发现缺省值是
mysql> SELECT @@sql_mode;
+--------------------------------+
| @@sql_mode |
+--------------------------------+
| STRICT_ALL_TABLES,NO_ZERO_DATE |
+--------------------------------+盲目地设置它会在设置您想要的一个的同时改变这两个:
mysql> set session sql_mode = 'ONLY_FULL_GROUP_BY';
mysql> SELECT @@sql_mode;
+--------------------+
| @@sql_mode |
+--------------------+
| ONLY_FULL_GROUP_BY |
+--------------------+因此,构建完整的字符串:
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 |
+---------------------------------------------------+如果您想在不知道已经设置了什么模式(S)的情况下添加/减去一个模式,这似乎是有效的:
打开(仅供会议使用):
SET @@sql_mode = CONCAT(@@sql_mode, ',', 'ONLY_FULL_GROUP_BY');关闭(仅用于会话):
SET @@sql_mode =
REPLACE(
REPLACE(
REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY,', ''),
',ONLY_FULL_GROUP_BY', ''),
'ONLY_FULL_GROUP_BY', '');注意逗号。
https://dba.stackexchange.com/questions/112739
复制相似问题