MySQLのフィールド名にmemberを使うとJavaでエラーになる件
先日、研修でこんなことがありました。
弊社の新人研修もコロナ対応で在宅と出社を交互に繰り返して実施しています。
ある受講者が会社では大丈夫なのに自宅だとエラーがでるプログラムがあるというのです。
それは、Javaの中に記述した要約すると以下のようなSQL文でした。
SELECT member FROM test;
結論から申し上げますと、原因は、予約語の問題でした。
フィールド名のmemberがMySQLの予約語だったわけですね。
予約語というのは、プログラム言語で予約されていて私たちが使えない単語のことです。
例えば、Javaであれば、
int int = 10;
のような書き方ができないことは容易に理解できると思います。
int int = 10; int
と書いた時の3つ目のintが型を意味しているのか、変数名なのか分からなくなりますからね。
MySQL Server Version ReferenceによればMで始まるMySQLの予約語は、以下のようになっています。
https://dev.mysql.com/doc/mysqld-version-reference/en/keywords-8-0.html#keywords-8-0-detailed-M
自宅から接続する先のMySQLのバージョンは8.0.17
memberが予約語に加わったのが8.0.18以降
会社のMySQLのバージョンは8.0.19
ということで偶然の重なりで発現したエラーでした。
おかげで新入社員の皆さんに予約語の注意喚起ができたのは怪我の功名でしたが。
ちなみに、予約語であっても以下のようにバッククオートで囲めば問題ありません。
SELECT `member` FROM test;
HeidiSQLをMySQLのクライアントに使っていたことも原因究明を困難にしていました。
自動的にバッククォートを補うHeidiSQLの機能によって発見が遅れてしまったのでした。
転職者の採用面接では、使用していたソフトウェアのバージョンを尋ねる面接官もいるそうです。
それだけバージョンに気を使って開発をしてきたかどうかということが問われるわけです。
という訳で、バージョンにはもっと注意を払うべきですね。