3

我在本地环境中有一个奇怪的问题:wamp64 mysql 5.7.14 OctoberCMS 382

这在几个插件中遇到过,例如,这个试图在后端显示幻灯片列表的插件

语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'dbname.flosch_slideshow_slides.sort_order';

这与 sql_mode=only_full_group_by 不兼容

(SQL:

选择flosch_slideshow_slidesslideshow_id, count(*) 作为计数

flosch_slideshow_slides

哪里flosch_slideshow_slidesslideshow_id在 (2, 1)

分组flosch_slideshow_slidesslideshow_id

sort_orderasc排序

)

其他示例略有不同。这个试图在前端显示产品列表

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #51 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'dbname.jiri_jkshop_products_categories.category_id';

这与 sql_mode=only_full_group_by 不兼容

(SQL:

在= 上从jiri_jkshop_products内部连接 中选择 * 。其中= 1 和 (8) 和= 1按asc顺序 分组jiri_jkshop_products_categoriesidjiri_jkshop_products_categoriesproduct_idactivecategory_idvisibilityidtitle

)

这些请求在此处触发:

后端\行为\ListController->listRender()

所以我没有手

我指定它在远程服务器和我伙伴的本地环境中完美运行

另一个有趣的点是,因为我应用了系统的最新更新(从版本 365 到 382)并安装了所有插件。然后,为了测试,我在远程服务器上做了同样的事情,它仍然有效

因为我主要在本地工作,这很烦人

你有一些想法来解决它吗?理想情况下无需修改 mysql/sql_mode

谢谢和问候,帕特里克

4

1 回答 1

3

很长一段时间以来,MySQL 都包含一个臭名昭著的非标准扩展GROUP BY,它允许以效率为名的古怪行为。这个扩展允许世界各地无数的开发人员在GROUP BY不了解他们在做什么的情况下在生产代码中使用。

特别是SELECT *GROUP BY查询中使用它是愚蠢的,因为标准GROUP BY子句需要枚举列。许多开发人员都以这种方式愚蠢。

读这个。https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

MySQL 团队一直在尝试在不弄乱生产代码的情况下修复这个错误功能。他们sql_mode在 5.7.5 中添加了一个名为ONLY_FULL_GROUP_BY强制标准行为的标志。在最近的版本中,他们默认打开了该标志。当您将本地 MySQL 升级到 5.7.14 时,该标志已打开,并且依赖于旧扩展的生产代码停止工作。

你的选择?

  1. 修复有问题的 SQL 查询,或让插件作者这样做。
  2. 回滚到与您使用的应用程序软件开箱即用兼容的 MySQL 版本。
  3. 更改您的服务器sql_mode以摆脱新设置的ONLY_FULL_GROUP_BY模式。

SET您可以通过执行命令来更改模式。

SET  sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

如果您在应用程序连接到 MySQL 后立即执行此操作,则应该可以解决问题。

或者,您可以在 MySQL 安装中找到 init 文件,找到该sql_mode=行并将其更改为 omit ONLY_FULL_GROUP_BY,然后重新启动服务器。

第一个有问题的查询?添加sort_orderGROUP BY子句中,像这样。

select flosch_slideshow_slides.slideshow_id, count(*) as count
  from flosch_slideshow_slides
 where flosch_slideshow_slides.slideshow_id in (2, 1)
 group by flosch_slideshow_slides.slideshow_id, sort_order
 order by sort_order asc

这会破坏什么吗?可能不是。

您的第二个违规查询?它包含SELECT *,因此您必须解开查询周围的代码以找出实际使用了哪些列,然后才能修复该GROUP BY子句。如果这是一个插件,那么这项工作最好由其作者完成。

于 2016-12-16T12:57:24.917 回答