Ruby+DBI+MySQL DATETIMEにTime使うな、と
(MySQL)DATETIME型のカラムに(Ruby)Time型の値を設定しようとしました。0000-00-00 00:00:00が設定されました。あれー?
0以外のおかしな値もちらほら。キャストに失敗してるなら全部0にならないの?
DBI「Dateだと思った?Timeでしたー^^」
さて、キャストをしている部分がこちら。
# /usr/local/lib64/ruby/gems/1.9.1/gems/dbd-mysql-0.4.4/lib/dbd/Mysql.rb #72 when ::DateTime "'#{obj.strftime("%Y-%m-%d %H:%M:%S")}'" when ::Time "'#{obj.strftime("%H:%M:%S")}'" when ::Date "'#{obj.strftime("%Y-%m-%d")}'"
で、確かにHH:MM:SSフォーマットはTIME型には有効な値です。
http://dev.mysql.com/doc/refman/5.1/ja/time.html
ただし、TIME型に限る。
文字列として指定された値に許容される柔軟なフォーマットはまぎらわしい事があります。例えば、'10:11:12' のような値は‘:’ が有る為に時刻値のように見えます。しかし、もし区切り文字が日付のコンテキストで利用されると、'2010-11-12' のように年として解釈されます。'10:45:15' 値は、'45' が正しい月を表す値ではないので、'0000-00-00' に変換されます。
http://dev.mysql.com/doc/refman/5.1/ja/datetime.htm
一部0以外の変な値になっていたのも納得。ぐぬぬ。
スキーマ考慮してくれないんですか、と思ったもののプリペアドステートメントで型なんてわかりませんよねっていう。。。
Timeだからって時刻専用と解釈するのはどうかと思うんですがどうなんでしょ。