mysqlの予約語に気をつけた方がいい

やられました...orz

直接sqlをいじることがなかったのですが、いじった時に気付きました。

mysql> show tables;
+-----------------------------------+
| Tables_in_foo |
+-----------------------------------+
| categories                        |
| comments                          |
| rankings                          |
| reads                             |
| schema_migrations                 |
| supplementals                     |
| taggings                          |
| tags                              |
| users                             |
+-----------------------------------+

こんな感じで表示されています。

ここでreadsテーブルのデータを取得しようとします。

mysql> select * from reads;
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 'reads' at line 1

なぜ、syntaxエラーになる???

おかしいだろ!ってなりました。

テーブルはきちんと作成されているのか?

reads.frm
reads.ibd

二つともきちんとある。

rails側では値が取得できている。

[1] pry(main)> Read.count
   (0.3ms)  SELECT COUNT(*) FROM `reads`
=> 0

わからん・・・。

試しにデータを投入しても、無事に投入できる。

ここで予約語っていう概念か?と思い調べました。

そうしたらREAD/READSが見つかりました。

ああ、そういうことかーってなりました。

予約語を使用する場合はバッククォートでエスケープすればいいです。

今思うと、上のrailssqlはきちんとバッククォートでエスケープしています。

今まで気にしなかったですが、予約語対策をしていたんですね。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.3 予約語