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」って書いてあるのに、表示してくれないことがあるんだ……。

MySQL8のデフォルト照合規則「utf8mb4_0900_ai_ci」について調べてみた

Facebook にシェア
Pocket

前からたまに、MySQLを仕事で使ってきたのですが、照合規則については詳しくなかった自分。現在の仕事で、ひらがなでもカタカナ、小文字でも大文字、全角でも半角が検索でヒットするシステムを作ってほしいとのことで少ししらべてみました。

ちなみに、寿司ビール問題(MySQL と寿司ビール問題 – かみぽわーる)というのは聞いたことあったので、ちょっとは問題あるんだろうなと思ったら、MySQL8では解決されているようです(寿司=ビール問題 : MySQL 8.0でのUTF8サポート入門 (MySQL Server Blogより) | Yakst)。

ただし、何やらデフォルトの文字コードだと日本語の照合にいろいろ問題があるとのこと。
参考:MySQL Innovation Day Tokyo で MySQL 8 の文字コードについて話した – @tmtms のメモ

というのも、デフォルトの「utf8mb4_0900_ai_ci」だと、アクセント違いは同じ文字の扱いになり、大文字小文字も同じ文字という扱いになるそうです。これがどういうことかというと、「はは」と検索したのに、「ばば」や「パパ」がヒットするということです。なんじゃそりゃ。

例えば「びょういん」で検索すると、下記のようになります(ID13~18は半角カタカナです)。

なお、このテーブルには「ひ゛ょういん」や「ひ゜よういん」もいれているのですが、それはヒットしませんでした。

ちなみに、like演算子で、「びょう」としても全部ヒットするわけではないらしいです。半角カタカナの「ビョウイン」や「ピヨウイン」などがでてきてないですね。濁点や半濁点は別の扱いなんでしょうか。

そういえば、先ほど紹介したMySQL8の話のページで知ったのですが、「株式会社」=「㍿」となるそうです。面白いですね。

ただ、これもlike演算子だとヒットせず。

内部的にどういう違いがあるんだろう? like演算子だと厳密ってわけでもないみたいだし。

ちなみに、仕事ではいろいろ試した結果、照合順序は「はは」と「ばば」と「ぱぱ」を区別する「utf8mb4_0900_as_ci」を使うことにしました。これだと、ひらがなでもカタカナ、小文字でも大文字、全角でも半角が検索でヒットするので。ただし、「びょういん」=「びよういん」にはなってしまうという。これだけ解決されれば、期待通りだったんだけどなぁ。日本語と英語の大文字小文字の違いを同じような扱いにしないでほしい。

会員登録せずにMySQLプログラムをダウンロードする方法

Facebook にシェア
Pocket

最初に言っておきますが、半分ネタエントリーです。

現在、業務でMySQLを利用しているのですが、必要なソフトをインストールするのに、いちいち会員登録をしなきゃいけなくて面倒だなと思っていました。ただ、会員登録しなくてもダウンロードできると知ったのでメモしておきます。

例えば、Windows用のMySQLインストールプログラムは下記からダウンロードできます。
MySQL :: Download MySQL Installer

MySQL Download

そして上記右下の『Download』ボタンをクリックすると、ダウンロードページではなく、下記のようなログインページに遷移してしまうんです。
MySQL Begin Your Download

しかし、ここで会員登録せずにダウンロードできる方法はありました!

それはなんと、左下の『No thanks, just start my download.』をクリックするだけ!

………………

いやいや、普通に読めばそりゃそうだろうという感じですよね。ダメですね。どうも英語は苦手でちゃんと読まずに、ログイン画面だから会員登録しなきゃいけないのだろうと思い込んでしまいました。

結果、オラクルから営業の電話がかかってくるという。残念ながら、自分には何の決定権ももちあわせていないんですよね……。

というわけでみなさんも、英語のサイトでも臆せず、注意深く読みましょう。分からなければ、Google翻訳しましょう。