Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

MySQLはTimeZoneを含めるDATETIMEフォーマットを受け付けるか

MySQLについての小ネタ。

昨日おせっかいメーカーを作成し、
サーバにアップしようとした時に起こった問題です。


まずローカルの環境でこのサイトを作成し、
一通り正常に動作する事を確認しました。
その後サーバにデータを移行し、データを登録しようとしたら次のSQLエラーメッセージが出ました。

error:SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2013-05-29T22:29:44+09:00' for column 'create_date' at row 1

今までこのようなメッセージが出た事はなかったのですが、datetimeのフォーマットが正しくないとの事。
さて何が原因だろう……と考えてみて、
タイムゾーン含まれてるのがいけないのかと思い至りました。

Zend Frameworkを自前で調整したZF-Exでは登録日・更新日を自動でセットしますが、
この時の時刻はZend_DateでISO_8601フォーマットへと成型するようになっています。
このフォーマットはタイムゾーンを含むもので、それが今回のケースでは受け付けられないようでした。

このサイトを置いてあるサーバはロリポップなのですが、
このサイトを立ち上げる時は特にこの問題は起こりませんでした。
そして他にサイトを開発した時もこのようにタイムゾーンを含める
フォーマットである事が度々ありましたが今までは問題が起こりませんでした。
今回新サイトを立ち上げるに当たってのみフォーマットエラーが発生しました。

多分MySQLの設定に依存した問題であり、
設定次第でどうにか対応できそうな気はするんですが……
(今回みたいなレンタルだとそこまで設定変更する権限がこちらにあるかは別の話)
ぐぐってもピンポイントでこのケースに該当する話が見つからず、
タイムゾーンを含めないフォーマットに変換してしまった方が早いと思い、
そのように変更しました。
対応としてはおよそこんな感じです。

$date = new Zend_Date();
$date_1 = $date->get(Zend_Date::ISO_8601);  // タイムゾーンを含むフォーマット
$date_2 = $date->get(Zend_Date::DATETIME);  // タイムゾーンを含まないフォーマット

このように変更する事で無事に動作しました。

しかしZF-EXではフォーマットにISO_8601を使ってて、
環境によっては同じようにここでMySQLのエラーが発生する可能性があります。
タイムゾーンを含める必然性もないし、
ちょっとここは次回のバージョンアップで直すようにしておきます。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment