MySQL是一个数据库,它一直在以难以使它脱离MySQL的方式违反SQL标准。 对于供应商锁定来说,似乎是一种聪明的技术(或者可能只是对标准的疏忽)可能在理解SQL语言的真正含义时非常烦人。
一个这样的例子就是MySQL对GROUP BY
工作方式的解释 。 在MySQL中,与任何其他数据库不同,您可以将任意表达式放入SELECT
子句中,即使它们对GROUP BY
表达式没有正式的依赖性。 例如:
SELECT employer, first_name, last_name
FROM employees
GROUP BY employer
这将在MySQL中工作,但这意味着什么? 如果我们每个employer
只有一份结果记录,那么将退还哪一位雇员? 上面查询的语义实际上就是这个:
SELECT employer, ARBITRARY(first_name), ARBITRARY(last_name)
FROM employees
GROUP BY employer
如果我们假设存在诸如ARBITRARY()
的聚合函数。 有些人可能会声称这可以用于一些聪明的性能“优化”。 我说:不要。 如此弱的指定,甚至不清楚该伪ARBITRARY()
聚合函数的两个引用是否会从同一记录中产生值。
只需看看围绕“不是GROUP BY表达式”错误而发生的堆栈溢出问题的数量即可:
- http://stackoverflow.com/q/26680353/521799
- http://stackoverflow.com/q/25103756/521799
- http://stackoverflow.com/q/17746590/521799
- http://stackoverflow.com/q/5587648/521799
- http://stackoverflow.com/q/5463838/521799
- 还有很多…
我敢肯定,这种损害是由一代SQL开发人员造成的,部分原因是它在某些数据库中有效。
ONLY_FULL_GROUP_BY
但是MySQL中有一个名为ONLY_FULL_GROUP_BY
的标志,MySQL社区经理Morgan Tocker 建议最终默认情况下将其打开 。
MySQL社区成员倾向于同意,从长远来看,这是一个不错的决定 。
虽然为旧版应用程序打开此标志当然非常困难,但是所有在MySQL之上构建的新应用程序都应确保打开此标志。 实际上,新应用程序甚至应该考虑完全启用“严格SQL模式” ,以确保它们获得更好,更现代的SQL体验。
有关MySQL服务器模式的更多信息,请考虑手册:
http://dev.mysql.com/doc/refman/5.7/zh-CN/sql-mode.html
翻译自: https://www.javacodegeeks.com/2014/11/use-mysqls-strict-mode-on-all-new-projects.html