在所有新项目上使用MySQL的严格模式!

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表达式”错误而发生的堆栈溢出问题的数量即可:

我敢肯定,这种损害是由一代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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值