Kouhei Sutou
kou****@clear*****
2015年 6月 26日 (金) 22:16:15 JST
須藤です。 In <20150****@domai*****> "[groonga-dev,03306] Re: Mroonga 5.03 ストレージモードで MySQL 5.6 のレプリケーションが切断される" on Tue, 23 Jun 2015 20:29:57 +0900, 各務 洋 <kagam****@outwa*****> wrote: > この対応版のリリースだと、今までと挙動が変わると思うのです。 はい、その通りです。 MySQL全体として、STRICT_TRANS_TABLESのときはwarningがerrorに なるという挙動なので、今まで対応していなかったのが問題で、そ れが修正された、という風に捉えています。 > リリースノートに今までだと warning 止まりだった例や、影響範囲がなるべ > く多く記述されていると助かると思うのですがどうでしょうか? はい、記述するべきだと思います。 >> mroongaストレージエンジンは月や日の値に指定された0を1へと自動的に補正します。 > > せっかくなので、この自動補正を使って warning にすらしない Flag があっ > てもいいのかなぁとも思いました。 いやぁ、それはMySQLらしさを損ねるのでやっちゃいけないかなぁ と思います。 >> InnoDBストレージエンジンには0000-00-00 00:00:00が格納できます。 > > これが謎だったのですが、せっかく日本語のが出来たので見てみると、 > > http://dev.mysql.com/doc/refman/5.6/ja/datetime.html > >> 無効な DATE、DATETIME、または TIMESTAMP 値は、適切な型の「ゼロ」値 >> ('0000-00-00' または '0000-00-00 00:00:00') に変換されます > > うーむ、ちゃんと仕様のようですね……。中は何が入っているんでしょうか。 > 名前の通り0なのかなぁ? たぶん、望まれていないと思いますが、実装の話をすると、MySQL は https://github.com/mysql/mysql-server/blob/5.7/sql-common/my_time.c#L1752-L1764 /* 1 bit sign (used when on disk) 17 bits year*13+month (year 0-9999, month 0-12) 5 bits day (0-31) 5 bits hour (0-23) 6 bits minute (0-59) 6 bits second (0-59) 24 bits microseconds (0-999999) Total: 64 bits = 8 bytes SYYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff */ にあるように、DATETIMEの値をUNIX時間ではなく、64bitの数値で 表現しています。この方法は日付の「値」ではなく「字面」を格納 しているのと同じなので、日付としておかしな値(0月0日)とかも 格納できます。一方、Mroonga(Groonga)はUNIX時間で表現してい るので日付の「値」を格納していることになります。よって、おか しな値を格納できません。 > http://dev.mysql.com/doc/refman/5.6/ja/using-date.html > >> ユーザーが入力したとおりに格納する (日付検証なしで) 場合に…… > snip >> MySQL は、日または月と日がゼロである日付の格納を許可します > > ぉぅ。。。なんという……。 個人的には、0月0日とか不正な日付ではなく、妥当な日付を使うこ とをオススメしたいところです。 (って、福岡のときにいい忘れていたかも。。。) -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/