SQLの結果のフィールド名が空白になってしまう現象に遭遇した

Facebook にシェア
Pocket

先日、会社の後輩に作ってもらったストアドで、なぜか一部、ストアドで返ってくる結果のフィールド名が空白になってしまうという現象が発生しました()。

具体的には下記のようなSQLとなっていた。

結果:

見てわかる通り、fruit_idのフィールド名は取得できているのだけど、fruit_nameのほうは空白になっている。試しに、コピペで順序を逆にしてみても、fruit_nameのほうが空白になった。

一見すると、何の変哲もないSQL。じっと見ていても何も分からなかったので、とりあえずコメントも消してみてもう少しシンプルな形にしてみようかと思ったときにちょっとだけ違和感。なんだかカーソルの動きが一部だけ大きいような……。

そう思って試しにテキストエディタに貼り付けてみたらわかりました。

fruit_nameのほうは、コメントの左側に全角スペースが入っています。

ただ、それでもなぜカラム名が空白になるのかすぐには分かりませんでした。何でこんな現象が起こるのかなと。

ですが、ちょっと考えてわかりました。これは、フィールド名は空文字ではなく、全角スペースになっているんだろいうことに。つまり、下記のようなSQLと同じようになっているということです。

つまり、別名をつけるASキーワードが省略されたと判断されて、フィールド名が全角スペースになっていたということです(今回試したのはMySQLですが、多分他のSQLでも同様の現象が発生するのではないかと思います)。

それにしても、なぜSQLはASを省略していいという仕様になったのだろうか。ASを省略しているSQLはよく見かけるけど、個人的に分かりにくいし、今回みたいによく分からないバグの原因にもなりかねない気がするのだけど。

MySQLの SELECT … INTO 構文で結果を変数に書き込むときの注意

Facebook にシェア
Pocket

先日少しはまった話。

MySQLにはSELECT … INTO 構文というものがあります。これを利用すると簡単にクエリー結果を変数に格納することができます。
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9.1 SELECT … INTO 構文

仕事で、MySQLのストアドを利用して、指定のIDとOUTパラメータを引数にセットし、OUTパラメータに引数に対応する値を返すというストアドを同僚が作っていました。そのストアドはSELECT … INTO 構文を使って下記のようになっていました。

実際のテーブルは下記のようになっているとします。

この時、p_idに1を指定すると、p_nameには「りんご」という値が入ります。

もちろん、p_idに2を指定すると、p_nameには「みかん」という値が入ります。

では、ここでp_idに10を指定するとどうなるでしょう。fruid_idが10のfruit_nameはないから、結果はnullになる。同僚もそうなると思ったようですが、違いました。

結果は一つ前に実行したときに取得した「みかん」を取得。プログラム作って動かしていた自分は、最初、「やけに同じ結果が返ってくるなぁ。てっきりnullが返ってくると思ったのだけど」なんて呑気に思い、しばらくバグに気づきませんでした。

これはなぜかというと、MySQLの変数はセッション変数で、つなげている間は結果が保持されるためだそうです。
参考:mysqlでユーザ定義変数をつかう – 眠すぎて明日が見えない

なので、上記のように変数に格納したい場合は、いったんnullで初期化する記述を追加したほうがいいです。


ただ、この程度だったら直接outパラメータを指定したほうがシンプルかもしれないですけどね。

それより、WorkBenchがちょくちょく結果を表示してくれないことがあった困る。何で、「1 row(s) returned」って書いてあるのに、表示してくれないことがあるんだ……。