设置mysql workbench的sql_mode,ONLY_FULL_GROUP_BY不起作用

来源:互联网 发布:ubuntu u盘挂载路径 编辑:程序博客网 时间:2024/05/08 23:04

问题

在mysql中,非严格的mysql默认情况下是可以正常执行的,

有用户表user,如下
这里写图片描述

虽然age不是group by字段,但是仍然可以在select中查询
这里写图片描述

但是我们知道这是非常不规范的方式,在某些情况下会产生业务上的错误;并且这样的sql在oracle中会报错,但是mysql默认是允许的。为了防止这种错误,我想到是否可以通过mysql客户端mysql workbench进行sql校验?

mysql workbench的尝试

经过一番研究,发现,Edit—–>Preference—–>General Editor中有个sql_mode
这里写图片描述

我欣喜若狂的设置了开启严格group by,但是不起作用。
查阅资料[链接1]mysql workbench sql_mode reference后,发现mysql workbench只支持部分sql_mode,原文如下

Only a subset of all possible SQL_MODE values affect the MySQL
Workbench SQL parser. These values are: ANSI_QUOTES,
HIGH_NOT_PRECEDENCE, IGNORE_SPACE, NO_BACKSLASH_ESCAPES,
PIPES_AS_CONCAT. Other values do not affect the MySQL Workbench SQL
parser and are ignored.

看到这几个名字也许不明白,这里先解释一下,

  • ANSI_QUOTES
    • 标准引用符,此参数开启后,双引号”当做关键字的引用符号,不再是文本字符串的引用符号,`作用不变仍然可以引用关键字。
  • HIGH_NOT_PRECEDENCE
    • not设置为高优先级, not a between b and c,会解释为 not (a between b and c),如果不加此参数,一些老的mysql版本,可能会被解释为 not a (between b and c)
  • IGNORE_SPACE
    • 忽略空格,就是函数名和(之间可以有空格,这种情况,它会把函数名当做关键字
  • NO_BACKSLASH_ESCAPES
    • 禁止反斜杠; 就是说\不再当做转义字符,只是普通的文本字符
  • PIPES_AS_CONCAT
    • 管线符连接,就是说||以前是逻辑或,开启此参数后,||就成为了字符串连接符,跟concat()函数一样了

转变思路,设置sql_mode变量

Ok,解释完毕,既然mysql workbench只支持有限的sql_mode,那么怎么开启严格group by模式呢?我又去翻了mysql sql_mode reference ,既然是sql_mode变量,可以通过变量值在限制group by,自然而然的,我们分别在session和global范围设置此变量

第一可以在session scope限制,set session sql_mode="ONLY_FULL_GROUP_BY"
第二可以在global scope限制,set global sql_mode="ONLY_FULL_GROUP_BY"

根据变量的语法,当然,也可以写成 set @@session.sql_mode=”“或者set @@global.sql_mode=”” 模式
关于mysql 变量请参考mysql 变量

设置后,再查询就会出错
这里写图片描述

总结

总结,mysql workbench作为一个客户端,也可以开启校验,但是由于不支持严格全group by,所以转变思路,考虑sql_mode是mysql服务器的系统变量, 所以只能通过设置系统变量来达到目的。

参考

mysql sql_mode reference
mysql workbench sql_mode reference

0 0