sql_mode=NO_BACKSLASH_ESCAPESについて
MySQL 5.0.16以前では,LIKE句を使用する際に「LIKE "*%hoge" ESCAPE "*"」といったようにLIKE句中で使用する特殊文字をエスケープするためのESCAPE句に対する制限がなく,何文字であっても受け入れていました.
しかしSQL2003ではこのESCAPE句に設定できるのは1文字の長さに限るという規約が追加されましたので,
http://ikda.net/fswiki/wiki.cgi?page=SQL2003#p3
MySQL側もこの対応を行うこととなりました.
MySQL 5.0.16以上ではデフォルトでESCAPE句に0文字か1文字を許容します。0文字を許容するのはSQL2003違反になりますが,これは既存のアプリケーションへの互換性を配慮するためのものです.0文字を許容することとなった経緯については次のバグレポートを参照して下さい.
http://bugs.mysql.com/bug.php?id=12595
Monty(Michael Widenius)による説明がなされています.
またこの変更はMySQL 5.0.16のCHANGELOGにも書かれています.
SQL2003に準拠して1文字のみを許容するようにMySQLを動作させるには,sql_modeに"NO_BACKSLASH_ESCAPES"を指定します."NO_BACKSLASH_ESCAPES"を指定することでMySQL 5.0.16以上ではESCAPE句に1文字のみを許容するようになります.
しかしね,許容文字数が1文字のみか,0または1文字かの動作モードの選択に使うフラグ名なんでしょう.なんで"NO_BACKSLASH_ESCAPES"っていう名前なんでしょうか.
違いは0文字の場合を拒否するか否かってことじゃん.
mysql> show variables like 'sql_mode'; +---------------+----------------------+ | Variable_name | Value | +---------------+----------------------+ | sql_mode | NO_BACKSLASH_ESCAPES | +---------------+----------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM t1 WHERE a LIKE '*%' ESCAPE ''; ERROR 1210 (HY000): Incorrect arguments to ESCAPE
my.ini変えて再起動して
mysql> show variables like 'sql_mode'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_mode | | +---------------+-------+ 1 row in set (0.00 sec) mysql> SELECT * FROM t1 WHERE a LIKE '*%' ESCAPE ''; Empty set (0.00 sec)
ううむ.