MySQLの4と5で、NOTの優先順位が違う。
久しぶりにMySQL4を使ってて冷や汗が出た。
- MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.1.3 論理演算子
- MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 7.2.1 演算子の優先順位
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標準外。
- SQLの比較演算子 - HHeLiBeXの日記 正道編 各DBの演算子対応表