MySQLの4と5で、NOTの優先順位が違う。


久しぶりにMySQL4を使ってて冷や汗が出た。

MySQL5

mysql> select not 1 = 2;
+-----------+
| not 1 = 2 |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

1は2じゃないですよねー ^^

MySQL4

mysql> select not 1 = 2;
+-----------+
| not 1 = 2 |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

えー……

いや昔は知ってたんだきっと……記憶にないけど……

具体的には

MySQL4 で次の SQL は絶対に結果を返さない。not name は 0 か 1 か NULL なので not name = 'koseki' は 常に FALSE(=0) になる。MySQL5 では見たとおりに動く。

mysql> select * from users where not name = 'koseki';
Empty set (0.00 sec)

「等しくない」の演算子は <> を使う。!= はSQL標準外。

MySQLのMLより

* mysql:15414

これはMySQL 4.xで演算子NOTの優先順位が最上位だったことが原因だと思います。
そのためid % 2 not in (1);では、%より先にnotのほうが先に評価されてしまう、
すなわちid % (2 not in (1));相当になり、結果セットが戻らないのだと思います。

これ昨日の投稿だ。偶然。