MySQLの Milestoneリリース番号のれきし

MySQL 5.8.0-m17 の声が聞こえ始めました。初出はおそらく、yoku08253報告の、これ。>
https://bugs.mysql.com/bug.php?id=80372

そんな中、梶山さんのこんなツイートがあったので、整理してみました。

MySQL 5.8.0-m17 ~
MySQL 5.7.0-m10 ~ 5.7.6-m16
MySQL 5.6.0-m4 ~ 5.6.6-m9
MySQL 5.5.0-m2 ~ 5.5.3-m3

そして、Milestone1 は、というと、どうも、MySQL 5.4 シリーズの開発を終了して 5.5 に集約した際に、5.4自体を Milestone 1 と名付けたということのようです。

http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=161

なので、我々一般人の目にはじめて触れた、「マイルストン番号」は m2 だったということになりますね。



[追記・訂正]
5.8.0-m17 という文字列の初出に関しては、すでに昨年7月には出ていたようです。
https://bugs.mysql.com/bug.php?id=77712

第6回札幌MySQL勉強会参画

第6回目となる「札幌MySQL勉強会」に参加してきました。
第5回も参加していたので、2度続けての参加となります。前回は2年半も前だけど(笑)。
atnd.org


f:id:sakaik:20160130183510j:plain

メニューはこんな感じ:

・@nobuhatanoさんの、「Mroonga を3年つかってみた」
・@yukiconExさんの、「ボトムアップで憶えるMySQL Nested Loop Join」
・やちさんの、PostgreSQL 9.5最新情報 
・坂井の、雑多な話(MySQL 5.7の最新情報とか新機能とかを中心に)

 これまで札幌には7,8回訪問していますが、一度も雪が降っているのを見たことがない。8回も行って一度もないということは、確率的に見て、これはもう「札幌に雪が降るというのはウソである!誰かの陰謀で作り上げられた虚像である!」と考えて良いでしょう。*1
 それを確かめるために、今回札幌にまた行ってみることにしました。

雪、ありました! なにやら形になっています! 札幌の雪、すごい!!
f:id:sakaik:20160130130727j:plain


 さて、勉強会の話に戻って、、、、
土曜日にも関わらず、10人くらいの方が参加されていました。富良野の勉強会とも繋いで、ご覧いただいていたのですが、あまりコミュニケーションが双方向でなく、せっかくなのにちょっと物足りなかったですね。一緒にやっている感を、次回ある時にはもうちょっと工夫してみたいところです。っていうか、中継じゃなくて、富良野、行きたい。

 私のお話は、
・自己紹介がてら、地元千葉県の紹介とかも
・「外に出よう」なご提案。「最先端じゃない情報も発信しよう!」なお話も。
MySQLの情報源や、MySQL5.7のお話

 の3つの部で構成させていただきました。
「外に出よう」なお話。自分の地元以外の場所での出逢いから、楽しいことが広がることも多いのですよ、という事をお伝えしたかったのですが、直前にバッサリ内容削った事もあって、ちょっと「伝わった感」が薄かったのが残念でした。コンパクトにぐぐっと伝えるテクニックが欲しい。。
 それから、MySQLを試して自分なりの発見があったとき、ブログ等に「自分なりの」気づきをどんどん書いて欲しいなぁと、常日頃から思っています。最先端の情報は今も盛んに投稿/更新されているのですが、そうでない部分の情報が「こんなの今更自分が書かなくてもいいよな」とか「みんな知ってるよね」などと勝手に判断して、書かない人が多いことでしょう。でも、「あなたよりも知らない人は、その情報を知らない」のです。あなたが、自分の前を行く人達の情報に助けてもらったように、あたなは、あなたの後ろから来る人のために道しるべを残して欲しい。そんなお話をさせていただきました。これ、ここ数十ヶ月(=数年)の私のテーマでもあるので、いずれ、もうちょっとまとまった形で整理したいなぁ。

 MySQL5.7については、要するに、速くなって、安全になって、いろいろ機能も増えた、という言葉がすべてです(笑)。新機能の中でも、今ちょっぴり spatial(空間情報)型に注目しているという紹介と、世間を騒がせた「パスワード360日問題」で次のマイナーバージョンではパスワード有効期限のデフォルトがゼロに変更されるよ、yoku0825さん++」というお話などをさせていただきました。
 資料公開しようと思ったけど、口頭補助を前提に作った資料だったので、見てわかるようにするのに手を加える必要がありそうです(あとまわしになっています。。)


 懇親会は、当然ジンギスカン。そしてその後は〆にラーメンを食べに行って、アタマもオナカも満足した札幌訪問でした。またやりましょう!

*1:種明かしすると、毎年ほぼ6月、たまに9月や11月に行っているのです

オープンソースカンファレンス(OSC)2015-Hamanako参加

 オープンソースカンファレンス2016浜名湖(OSC2016-Hamanako)に参加してきました。
浜松での開催で、初回(OSC-Hamamatsuと称していた時)以来の久々の参加です。
前の週と翌週とに別件の遠出の予定が入っていたので、今回のOSC-Hamanakoも参加しない予定だったのですが、昨年末の OSC2015-Tokushima でこちらの実行委員長さんに会ってしまい、「来てよ」と言われれば、行かないわけにはいきませんよね(笑)。
 http://www.ospn.jp/osc2016-hamanako/

f:id:sakaik:20160123093116j:plain


 OSCへの参加は、前夜祭が命! 濃い話も熱い話も満載となることが多いので、毎度楽しみにしています。今回も、金曜日の都内での用事を済ませた後に新幹線で浜松入り。マインシュロスというオシャレなビアホールでした。地ビールを売りにしているだけあって、ビールがおいしかったですね。その後は、有志で浜松餃子を食べに。すでにお腹は満足していたので、4人で3人前の餃子を頼んだのですが、あまりにおいしくて、更に4人前を追加しました。写真は4人前。
f:id:sakaik:20160122214919j:plain:h330 f:id:sakaik:20160122224205j:plain:w330


 とても良い、OSC2016-Hamamatsu 参加でした!!






・・・・と言いたくなるくらい、前夜祭で満足(笑)。

 当日は、出世大名家康くんも来てくれました。MySQLのマスコットであるイルカ(サキラ)とパチリ。f:id:sakaik:20160123101532j:plain:h300
比較的まったりとした会だったので、少し他のブースでお話を聞いたり、久々の知人らにご挨拶をしたりしながら、大部分の時間を自ブースでお喋りして過ごしました。いろんな事を教えてもらって、ついでにこの時間内に bugs.mysql にひとつ報告を揚げたりして、有意義でした^^
はじめて具体的に「MySQL 5.8」という文字を目にすることができたのも、大きな収穫。


 懇親会後、21:59の電車で帰路。通常の懇親会(1次会)を慌ただしくもなく最後まで居る事ができて、駅でおみやげ買う時間も十分にある状態で、帰宅できるというのは、新幹線やっぱりすごいですね。日本がぐっと狭くなる。土曜日の最終の東京に向かうひかり車内は、こんな感じ。
f:id:sakaik:20160123215847j:plain:w330

MySQL の "0000-00-00" は NULL?

数日前に、とみたまさひろさんのこんなツイートがありました。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.3.2 比較関数と演算子
"NOT NULL として宣言された DATE および DATETIME カラムでは、次のようなステートメントを使用することで、特殊な日付 '0000-00-00' を検索できます"

その後の twitter でのとみたさんとのやりとりも含め、なんじゃそりゃな仕様に興味を持ったので、自分でも試してみました。


テーブルを作ります。

mysql> CREATE TABLE dtsample (id integer, dt date);

データを入れます。一応中身も見てみる。

mysql> INSERT INTO dtsample values (1, null), (2, "0000-00-00"), (3, "0000-00-00"), (4, "2015-03-10"), (5, "2014-11-05"),(6,"2016-01-01");
mysql> SELECT * FROM dtsample;
+------+------------+
| id   | dt         |
+------+------------+
|    1 | NULL       |
|    2 | 0000-00-00 |
|    3 | 0000-00-00 |
|    4 | 2015-03-10 |
|    5 | 2014-11-05 |
|    6 | 2016-01-01 |
+------+------------+


このテーブルから、NULLのものと、NOT NULL のものを検索してみます。

mysql> SELECT * FROM dtsample WHERE dt IS NULL;           
+------+------+
| id   | dt   |
+------+------+
|    1 | NULL |
+------+------+

mysql> SELECT * FROM dtsample WHERE dt IS NOT NULL;
+------+------------+
| id   | dt         |
+------+------------+
|    2 | 0000-00-00 |
|    3 | 0000-00-00 |
|    4 | 2015-03-10 |
|    5 | 2014-11-05 |
|    6 | 2016-01-01 |
+------+------------+


あれれ? 普通ですね。6件のうち、IS NULLが1件、IS NOT NULLが5件。
もう一度マニュアルをよく読んでみましょう。

NOT NULL として宣言された DATE および DATETIME カラムでは、次のようなステートメントを使用することで、特殊な日付 '0000-00-00' を検索できます。

カラム定義として、NOT NULL 制約が必要だったようです。
やりなおおし。

mysql> CREATE TABLE dtsample2 (id integer, dt date NOT NULL);

mysql> INSERT INTO dtsample2 values (11, null), (12, "0000-00-00"), (13, "0000-00-00"), (14, "2015-03-10"), (15, "2014-11-05"),(16,"2016-01-01");
ERROR 1048 (23000): Column 'dt' cannot be null

mysql> INSERT INTO dtsample2 values (12, "0000-00-00"), (13, "0000-00-00"), (14, "2015-03-10"), (15, "2014-11-05"),(16,"2016-01-01");
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM dtsample2 WHERE dt IS NOT NULL;      
+------+------------+
| id   | dt         |
+------+------------+
|   12 | 0000-00-00 |
|   13 | 0000-00-00 |
|   14 | 2015-03-10 |
|   15 | 2014-11-05 |
|   16 | 2016-01-01 |
+------+------------+

 先ほどと同じデータを登録しようとしたら、カラムの NOT NULL 制約のために id=11 のデータが登録できなかったので、除外して登録しました。


 さて、ショータイムっ!

NULL のものと NOT NULL のものを、見てみましょう。まず IS NOT NULL。

mysql> SELECT * FROM dtsample2 WHERE dt IS NOT NULL;      
+------+------------+
| id   | dt         |
+------+------------+
|   12 | 0000-00-00 |
|   13 | 0000-00-00 |
|   14 | 2015-03-10 |
|   15 | 2014-11-05 |
|   16 | 2016-01-01 |
+------+------------+

 うん。NOT NULL なんだから、この5件が出ますよね。問題ない。
次に IS NULL。

mysql> SELECT * FROM dtsample2 WHERE dt IS NULL; 
+------+------------+
| id   | dt         |
+------+------------+
|   12 | 0000-00-00 |
|   13 | 0000-00-00 |
+------+------------+

 2件が出てきました。へんなの。
これは、マニュアルにも書いてあるとおり、バグではなく狙ってこのような仕様になっているとのことです。

ODBC では '0000-00-00' 日付値がサポートされていないため、一部の ODBC アプリケーションを取得する際に、これが必要になります。


 カウントも取ってみましょうか。

mysql> SELECT COUNT(*) FROM dtsample2 WHERE dt IS NULL;
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+

mysql> SELECT COUNT(*) FROM dtsample2 WHERE dt IS NOT NULL;
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+

 髪結新三もびっくり。大家さんもびっくり。
「上が十両、下が五両。十両と五両で十五りょ、、、、、りょりょりょ????」まぁ新三のお話の場合は十両と五両で18両くらいになったりするわけで両者ハッピーでしょうけど、RDBMSではこれは困ります。というか気持ち悪い。エチケット袋が必要です。


 更に、この NULL 判定については、微妙に半端な対応になっているようで、CASE文の中の判定では、"0000-00-00" も NULL とは判定されません。

mysql> SELECT id,
    ->        CASE WHEN dt IS NULL THEN 1 ELSE 0 END is_null, 
    ->        CASE WHEN dt IS NOT NULL THEN 1 ELSE 0 END is_not_null
    ->   FROM dtsample2;
+------+---------+-------------+
| id   | is_null | is_not_null |
+------+---------+-------------+
|   12 |       0 |           1 |
|   13 |       0 |           1 |
|   14 |       0 |           1 |
|   15 |       0 |           1 |
|   16 |       0 |           1 |
+------+---------+-------------+

 ID IN (12,13) のところでは is_null にも is_not_null にも 両方に 1 が立つことを期待していたのですが、そうはなりませんでした。WHERE dt IS NULL の COUNT(*) が2件もあったのにねぇ。


 こんな感じで、とみたまさひろさんの発見(発掘?)した、MySQL の新しい楽しみ方を紹介しました。みなさまよいお年を!

2015年12月:アドヴェントカレンダー「MySQLマニュアルを読む」記録(リンク集)

おそらく一生で最初で最後の「ひとりアドヴェントカレンダー」を完走した記念に、自分の日記のところでもカレンダー形式のリンク集を作って見ました、、、、、が、単純にはてな記法するだけだと崩れまくりです(^^; まぁいいや。

完走記念(というわけではありませんが)1月半ばに福岡で sakaikを囲む会(通称さかいかい)やります。福岡のみなさん、あそびましょ!呑むだけですが。

2015年12月:アドヴェントカレンダー「MySQLマニュアルを読む」

30 1MySQLのリファレンスマニュアルを読もう 2MySQLリファレンスマニュアルのURL 3MySQLマニュアルの「チュートリアル」 4MySQLの数値数学関数いろいろ 5MySQLマニュアルより「制限事項」 6MySQLマニュアルから「型」いろいろ
7MySQLの文字列関数はこんなにある 8MySQLで使うファイルフォーマットも書かれているマニュアル! 9MySQLのサンプルデータベースはココにある 10MySQLの構文をマニュアルでしっかり確認してみよう 11MySQL 5.7で一瞬だけ入ったSELECT構文内の句 12MySQLマニュアルの「Topic」での一覧表示 13MySQLの公式yumリポジトリでのメジャーバージョン更新方法
14MySQLメジャーバージョンアップ後に必要なスクリプト 15マニュアル以外にもあるMySQLの最新情報源 16MySQLマニュアルはダウンロードして手元にも! 17MySQLの様々な拡張方法を知る 18MySQLマニュアルの「INFOR MATION _SCHEMA」を読む 19MySQLの新しい「sys」スキーマ 20MySQLマニュアルでのバージョン番号の説明とか
21MySQLマニュアル、5.6と5.7の違い(Level 1) 22MySQLマニュアル、5.6と5.7の違い(Level 2) 23MySQL Workbench のマニュアルは本体とは別にあった 24MySQLサーバの複数立ち上げ 25MySQLマニュアル(html)に章番号とかが欲しい 26 27


qiita.com


■その他のMySQL関連(MySQLまたはMySQLな人)アドベントカレンダー2015
qiita.com
qiita.com
qiita.com
qiita.com

MySQLマニュアル(html)に章番号とかが欲しい

この記事は、2015年「MySQLマニュアルを読む」アドベントカレンダーの最終日25日目です.


 かつてないほど(当社比)にMySQLのマニュアルに触れた25日間も今日が最終日。毎日面白いこと探しのためにマニュアルを眺めていると、不便に感じることがあります。それは、「htmlマニュアルの左側のブロックにあるインデックス(もくじ)に章などの番号がないこと」です。

f:id:sakaik:20151225214915j:plain

 クリックしてマニュアル本体を表示させれば、そちら側には番号があるのですが、第何章を見たいと思った時に、なかなか一発で希望の章に到達できませんし、やはり章番号のついていない目次は、のっぺりとしていて高さの壁を一層つらく感じてしまいます。

 ということで、おそるおそる希望を出してみました。bugs に書くのは、もしかしたら初めてなのかも。(昔なにかを書いた気がするのは、別アカウントだったからなのか記憶違いなのか、とにかく履歴には出てこないので。。)
 こんな感じでよかったのでしょうか。>諸先輩方

https://bugs.mysql.com/bug.php?id=79769

シビアさS4で出しちゃったからか、まだ誰も相手にしてくれませんが、たぶんちょっとしたことだと思うので、対応してくれたらいいなぁと願っています。



それから、MySQL 5.6 の日本語マニュアルには PDF でのダウンロードが提供されていません。きっとPDF作成時のフォントの問題だと思うのですが、PDFでも欲しいですよね。たぶん非ネイティブにはふぉんとに難しい問題なのかもしれませんが。。これも bugs に上げていい話題なのかしらん。。


 ということで、なんとか書き切った「ひとりアドヴェントカレンダー」。苦し紛れの日もあり、心から書きたかった話題を書いた日もあり、ひとつくらいは読んで下さった方のお役に立てたことがあれば嬉しいです。


私にとっては、マニュアル読むぞと大騒ぎした結果、yoku0825さんの血豆の滲むような、この努力の話を聞けたこと*1が、大きな収穫でした。このマニュアル(しかもバージョン5.1の、日本語への翻訳が必要な日本語マニュアル)を3度も読んだというのが、今のyokuさんのベースになっているのだと、納得しました。 やっぱり yokuさんはよく読んでる。

www.slideshare.net



 毎日少しマニュアルを読んで翌日はまた別の話題に移る、というのが、意外にもストレスだったので、今後は書きたい内容や情報がある程度まとまってから書きたいと思います。25日間お付き合いして下さった方がもし居たとしたら、ありがとうございました!メリークリスマス。

*1:1年半ほど前のものでしたが見落としていました

MySQLサーバの複数立ち上げ

この記事は、2015年「MySQLマニュアルを読む」アドベントカレンダーの24日目のぶんです.


 MySQLサーバは、1台のマシン(というか、ひとつのOS)の上に複数立ち上げることができます。1台でレプリケーションの実験をしたり、複数のバージョンの動作を比較してみたい時などに便利です。
原理としては、データディレクトリとポートをそれぞれの mysqld プロセスごとに用意すれば良いわけですが、このあたりのことも、その他のオプションを含め、ちゃんとマニュアルにくわしく説明されています。


MySQL :: MySQL 5.7 Reference Manual :: 5.3 Running Multiple MySQL Instances on One Machine

5.3.1 Setting Up Multiple Data Directories
5.3.2 Running Multiple MySQL Instances on Windows
    5.3.2.1 Starting Multiple MySQL Instances at the Windows Command Line
    5.3.2.2 Starting Multiple MySQL Instances as Windows Services
5.3.3 Running Multiple MySQL Instances on Unix
5.3.4 Using Client Programs in a Multiple-Server Environment

 基本的な事項の説明のほか、WindowsUNIX系 それぞれについての節が設けられています。

 この章で説明されている手順で、手作業により複数の mysqld を実行することもできますが、複数立ち上げを助けてくれる、mysqld_multiというスクリプトもあります。
これは別の章にて説明されています。
MySQL :: MySQL 5.7 Reference Manual :: 4.3.4 mysqld_multi — Manage Multiple MySQL Servers

なお、この mysqld_multi は、UNIX系のみでなく、Windows版のアーカイブにも含まれています。mysqld_multi.pl という名前で、一応中身には Windows 用のパス定義が書かれていたりするので、ちゃんと動作することを意図したものだと思われます(動かしたことがないので、わからない)。


最近こういうのを全然試せていないので、落ち着いたら*1、試してみたいところです。「積ん試したいもの」が、こうして増えていく。。。

*1:と言っているといつまでも落ち着かないので「落ち着かせて」ですね