MySQLのvarcharカラムと数値を比較すると大変なことになる

Tsukasa OISHI

まずは以下を見ていただければ一目瞭然かと思います。

mysql> desc articles;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id      | int(11)      | NO   | MUL | NULL    |                |
| title        | varchar(255) | NO   |     | NULL    |                |
| body         | text         | NO   |     | NULL    |                |
| access_count | int(11)      | NO   |     | 0       |                |
| created_at   | datetime     | YES  | MUL | NULL    |                |
| updated_at   | datetime     | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
7 rows in set (0.02 sec)

mysql> select count(*) from articles where title = 0;
+----------+
| count(*) |
+----------+
|      821 |
+----------+
1 row in set (0.03 sec)

mysql> select count(*) from articles where title = '0';
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)


mysql> select count(*) from articles;
+----------+
| count(*) |
+----------+
|      832 |
+----------+
1 row in set (0.00 sec)

varcharのカラムに対して、誤って数値で検索してしまうと、対象のカラムが数値に変換されてから比較が行われてしまうようです。

http://stackoverflow.com/questions/7880936/mysql-retuns-all-rows-when-field-0

つまりtitleカラムが、0または数値以外の文字で始まるレコードがすべてヒットしてしまうことになります。

mysql> select title from articles where title <> 0;
+------------------------------------------------------------------+
| title                                                            |
+------------------------------------------------------------------+
| 2007年になったが、まだ車は空を飛びそうにない                     |
| 404エラーを返さなくちゃだよ                                      |
| 24時間以上の                                                     |
| 3の倍数と3のつく数字のときだけ阿呆になる                         |
| 35歳定年説                                                       |
| 1万字突破                                                        |
| 16000                                                        |
| 4600                                                         |
| 40歳になるまでに                                                 |
| 35歳を超えたエンジニアの5つの働き方                              |
| 37signals                                                        |
+------------------------------------------------------------------+
11 rows in set (0.00 sec)