您的位置:首页 > 数据库 > MySQL

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

2017-01-17 17:32 731 查看

问题

在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: