読者です 読者をやめる 読者になる 読者になる

'数値e数値' という文字列を 含む SQLの謎

SQLで ’数値e数値' という文字列をクエリに含んだときの挙動が謎です。 (0e0 とか 1e10 とか ... 指数表記というのかな?)


例えば

mysql> select 1e1;
+-----+
| 1e1 |
+-----+
|  10 |
+-----+
1 row in set (0.00 sec)


これは指数の計算をSELECTしたとクエリとして解釈されるんですが、



'数値e数値' の後尾に文字列を付加した場合


mysql> select 1e1hoge;
+------+
| hoge |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

こんな結果になります。この場合 '1e1hgoe' を カラム名としては認識しないようです。これが謎だった。

mysql> select 1e1 hoge;
+-------+
|  hoge |
+-------+
|    10 |
+-------+
1 row in set (0.00 sec)

'数値e数値' の間に空白をいれても同じ結果が返ります。ま これはカラム名エイリアスということなので正常な結果か.


mysql> select "1e1hoge";
+-----------+
|  1e1hoge  |
+-----------+
|  1e1hoge  |
+-----------+
1 row in set (0.00 sec)


mysql> select `1e1hoge`;
ERROR 1054 (42S22): Unknown column '1e1hoge' in 'field list'
mysql> 

クォートすると文字列として扱われて、バッククォートするとカラム名として認識されます。これも予想通りの挙動ですね。




テーブル名に使うとシンタックスエラーを吐きます。おそらく select * from 1e1 _table と解釈してる

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


1e1でテストしましたが、100e100とか 0e100 とかでも結果は同じです。

SQLの仕様か、mysqlの仕様か もしくはバグか何なのかよく分からない。ちゃんとクォート処理しろってことか