[MySQL] MySQLのキーワード、予約語

2018年7月2日月曜日

MySQL SQL

MySQLの予約語?

SQLでは基本的に予約語をテーブル名やカラム名に使うことはできない。

MySQL 5.6 9.3 予約語
https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html

"IN"や"FROM"をカラム名に使うことはないと思うけど、"RANGE"とか"REPEAT"とか"SEPARATOR"なんかは使ってしまいそうな気がする。

例えば、カラム名に"repeat"を使ってテーブルを作成しようとすると以下のようになる。

> create table Repeats(id char(10), repeat tinyint);
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 'repeat tinyint)' at line 1

エスケープするには

こう言う場合は`(バッククォート)で囲むことによって、カラム名として扱うことができる。

> create table Repeats(id char(10), `repeat` tinyint);
Query OK, 0 rows affected (0.04 sec)

ただし、テーブル作成時のみでなく、このカラムを参照する時も`で囲む必要がある。

> select repeat from Repeats;
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 'from Repeats' at line 1
> select `repeat` from Repeats;
Empty set (0.01 sec)

MySQL8ではキーワードが増えている

今回試したのはMySQL5.7だったけど、MySQL8ではキーワードが増えている。

MySQL 8.0 9.3 Keywords and Reserved Words
https://dev.mysql.com/doc/refman/8.0/en/keywords.html

こんなにたくさん使えない単語がある!と思うかもしれないけど、厳密にはキーワードと予約語は違い、キーワードの中でも予約されているものと予約されていないものがあるみたい。
この中で予約されている(キーワードの右に(R)がついている)ものだけがエスケープしないとMySQLで文法エラーになってしまう。