在看refman时看到sql_mode中的这个参数HIGH_NOT_PRECEDENCE时,刚开始有点理解不了官方举的例子,就是关于not的优先级的例子。
原文部分:
· HIGH_NOT_PRECEDENCE
NOT操作符的优先顺序是表达式例如NOT a BETWEEN b AND c被解释为NOT (a BETWEEN b AND c)。在一些旧版本MySQL中, 表达式被解释为(NOT a) BETWEEN b AND c。启用HIGH_NOT_PRECEDENCESQL模式,可以获得以前旧版本的更高优先级的结果。
mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 0
mysql> SET sql_mode = 'broken_not';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 1
为什么例子中的sql_mode是broken_not呢?
我自己测试了一下(把-5和5换成了-2和2):

第二个SQL语句相当于select not (select 1 between -2 and 2);
即select not 1;所以是0.
而将sql_mode改成HIGH_NOT_PRECEDENCE后,not的优先级变成更高了(和旧版本一样),变成select (not 1) between -2 and 2;
即select 0 between -2 and 2;这个是成立的,所以结果为1。(后来突然想到的,这个当时没想到,鄙视一下自己)。


标签: HIGH_NOT_PRECEDENCE, MySQL, sql_mode