最近ずっと、MySQL。

今日、ハマりました。

何気なく新規テーブルを作成してローカルサーバー(XAMPP)上で動作確認をしてみたところ、エラーが出た。

mysql_error()関数を使うと、エラーが出たSQL文の一部がそのまま表示されてしまいセキュリティー的に超NGなので、普段は使っていない。

しかしソースを見てもエラーの原因が皆目見当つかなかったので、ローカル環境においてmysql_error()関数を使ってエラーの内容を見てみた。

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 '~' at line 1

なんじゃ、コリャ。

調べてみた。

mysqlのテーブル名にハイフン(-)
http://tairand.exblog.jp/9163596/

基本的に、mysqlのテーブル名(に限らないけど)には、ハイフン '-' は使わない。

というのは、普段何気なく書いているクエリーには、バッククォートをつけていないから。

その状態でテーブル名にハイフン'-' を使用するとエラーがでますので。

僕は基本的にこの人の逆。

というのは、普段何気なく書いているクエリーには、必ずバッククォートを付けているから。

、、、そのはずだった。

しかし。

よくよく見てみると。

付けているのは、“カラム名”だけだった。

そう。

何故だか分からないのだが、“テーブル名”にはバッククォートを付けていなかったのであるorz

今まで、幸か不幸かテーブル名にハイフン“-”が入らなかったため問題なくスルーしていたのだが、今回テーブル名を“e-mate_userinfo”としたため、エラーが出てしまったのである。

しかし、知らなんだ。

というのも、「カラム名やテーブル名に“SELECT”や“ORDER”などの“予約語”を使った場合にエラーが出る」ということは知っていたので必ずバッククォートを付けるようにしていたからである。

だから今回も「“mate”って予約語だっけ?いやでも後ろにアンダースコア“_”付けてるから大丈夫よな、、、」ってなカンジで迷走が始まってしまった。

MySQLのオンラインマニュアルを調べたら、次のようなことが書いてあった。

MySQL 4.1 リファレンスマニュアル
http://dev.mysql.com/doc/refman/4.1/ja/legal-names.html

識別子が予約語である場合や、識別子に特殊文字が含まれている場合は、引用符として使用したバッククォート(「`」)文字でその識別子を必ず囲む必要があります。

前半部分しか知らなかった。

なるほど、ハイフンがここでいう“特殊文字”なのね。。。

アンダースコアは大丈夫なのに。。。

知らなんだ。

まあそんなワケで、テーブル名もバッククォート“`”で囲ったらエラーが出ませんでしたとさ。

ちゃんちゃん。