バージョンが変わっただけなのにsyntaxエラーってそんなバカな…
先日サーバを移転したのですが
これまで正常に動いていたWebアプリの
SQLのINSERT文がsyntaxエラーを起こすようになりました。
MariaDB [test]> insert into rank(num, name) values(1, '阪神');
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version
for the right syntax to use near
'rank(num, name) values(1, '阪神')' at line 1
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version
for the right syntax to use near
'rank(num, name) values(1, '阪神')' at line 1
たしかにエラーになります。
こんな簡単なINSERT文がエラーになるわけないと小一時間調査…
結論から言うとMySQLのバージョンアップにより
以前はなかった予約語が予約語になったために文法エラーになったようです。
今回は「rank」という関数が追加されたために予約語となったようです。
対処法1.テーブル名とカッコの間にスペースを挟む
テーブル名「rank」の後に半角スペースを挟みます。
これなら予約語であってもテーブル名として認識されるようです。
MariaDB [test]> insert into rank (num, name) values(2, '巨人');
Query OK, 1 row affected (0.002 sec)
Query OK, 1 row affected (0.002 sec)
対処法2.テーブル名をバッククオートで囲む
個人的に読みづらくなるのであまり好きではないのですが
バッククオートで囲んでもテーブル名として認識されるようです。
MariaDB [test]> insert into `rank`(num, name) values(3, '広島');
Query OK, 1 row affected (0.002 sec)
Query OK, 1 row affected (0.002 sec)
対処法3.一般的な単語をテーブル名として使用しない
「rank」などいかにも将来的にぶつかりそうな名前だったと反省しました。
昔ながらの「tbl_rank」のような名前にすれば予約語とぶつかる可能性はぐっと減りますね。