MySQLの文字列連結

MySQLSQL構文はちょっと特殊でSQL Injectionの確認を行なうときには、ちょっと面倒だったりします。

私がイヤなことの一つに、MySQLでは文字列連結の演算子がないことがあります(concat関数による文字列連結は可能。またANSIモードのMySQLでは「||」による文字列連結ができるらしいですが、ANSIモードで動かしているサーバは殆ど無いと思います)。

ですが、今日少し試していたら、concatを使わずに文字列連結する方法があることに気が付きました。

mysql> insert into tableB values ('ab' 'c');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tableB;
+-----+
| ID  |
+-----+
| abc |
+-----+
1 row in set (0.00 sec)

上の「'ab' 'c'」のように、クォートされた文字列を空白文字で挟んでやると、「'abc'」と書いたのと同じことになるようです。

今度はSELECT文です。

mysql> select * from tableB where id='a'/**/'bc';
+-----+
| ID  |
+-----+
| abc |
+-----+
1 row in set (0.00 sec)

空白文字の代わりにSQL文のコメント「/*〜*/」を間に挟んでも大丈夫みたいです(MySQL5では)。

ただ残念ながら、上記の方法で結合できるのはリテラルな文字列だけでした。以下のSQL文はエラーになってしまいました。

mysql> insert into tableB values ('a' hex('b'));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'hex('b'))' at line 1

文字列連結の演算子が無くてもSQL Injectionの確認は可能なわけですが、上記の方法が使えると便利な場面もあるかもしれません。私自身はこのような方法があるのを今まで知らなかったので、日記に書いてみました。

試したのはMySQL5.0.26と4.1.22です。