问题
在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服务器的系统变量, 所以只能通过设置系统变量来达到目的。