2

我在 IBM Cloud CF 应用程序中使用Compose for MySQL DB,但是数据库的当前sql_mode设置不允许我使用GROUP BY语句运行标准 SQL 查询。

我从研究中了解到,我需要更改 MySQL 数据库的“sql_mode”配置选项。这是我理解需要执行的mysql语句:

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

但是,当我使用我的管理员凭据在我的 mysql 客户端上尝试这个时,它告诉我我需要超级用户权限,所以我似乎需要 ROOT 登录访问权限。在 IBM Cloud Dashboard 中,root 登录数据库的凭证不可用,只有“ADMIN”用户详细信息,显然没有此操作的权限。

总之,我向 IBM Cloud Support 提出的问题是,我需要做什么才能在 Composer for MySQL Database 上启用 GROUP BY 查询?是否可以通过composer.json或其他方法等进行配置?

PS。不要在家里尝试这个- PHPMyAdmin - 所以我有 PHP MyAdmin 访问 IBM Cloud 中的 MySQL 数据库,所以我在那里运行了上面的查询,它使数据库崩溃并使其无法访问。我不得不恢复!

---- 部署细节 ------------ 平台:IBM Cloud(又名 Bluemix) 产品:Compose for MySQL 部署细节:类型 MySQL (5.7.20)

4

1 回答 1

2

尽管您不能全局更改 sql_mode(因为它会影响数据库的所有用户),但您可以在每个会话的基础上更改设置。

这是一个简短的例子......

mysql> SELECT name, address, MAX(age) FROM example GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY 
clause and contains nonaggregated column 'compose.example.address' 
which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by

根据 SQL92,这是不允许的。如果我们检查...

mysql> select @@SESSION.sql_mode;
 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 |

1 row in set (0.02 sec)

好的,让我们禁用它...

mysql> SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Query OK, 0 rows affected (0.02 sec)

mysql> select @@SESSION.sql_mode;
 STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
1 row in set (0.03 sec)

现在我们可以再试一次......

mysql> SELECT name, address, MAX(age) FROM example GROUP BY name;               
Empty set (0.03 sec)

现在我们可以运行命令了。你必须把...

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

在要使用这种 SQL99-later 命令样式的任何会话开始时。

于 2018-02-14T11:28:00.223 回答