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)

ううむ.