ことの発端は、最近契約したレンタルサーバーに環境構築をして動作確認をしたときに、
Formから登録した日付が、全然意図しないものになってDBに保存されていたことだ。
例えば、1990-09-11 が、0168-11-09などになっていた。
最初は、開発環境のDBがMySQL5.1に対し、本番環境はMySQL5.5にしていたから問題が発生したと思っていた。
そこで、5.1にしたのだが、状況変わらず。
ログを見ると、インサート文の段階で、上記のパラメータが設定されていたので、
Tomcatや、Javaのバージョンの違いかと思い、開発環境と合わせたが変わらず。
リリースしたWarファイルに問題があるかと思い、別のサーバーにデプロイしたが正常に動く。。。
仕方ないので、意図した日付が格納できるようにソースを変更した。
変更前:
Users entity = Beans.createAndCopy(Users.class, usersForm).execute();
変更後:
Users entity = Beans.createAndCopy(Users.class, usersForm)
.sqlDateConverter("yyyy/MM/dd", Names.users().birthday()).execute();
このように変更をすると、DB上には意図したものが格納されるようになった。
しかし、今度は取得するときに
1990-09-11 が、09-11-1990になって、パースエラーが発生。
意味が分からなくお手上げ状態になっていたのだが、同僚がこの日付形式はアメリカ式だと気づいてくれた!
そこで、サーバーの文字コードを確認するとLANG=en_US.utf8になっていた orz
こいつのせいか、これでJAVAのロケール判定でUSになってしまい狂っていたのだ。
早速、文字コードをja_JP.UTF-8に変更して、/etc/sysconfig/i18nも修正して、localeコマンドでチェック。
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
それっぽくなったので、アプリケーションの動作も再度確認したところ意図したとおりになった!!
初めて借りたレンタルサーバーだから、どういう風にインストールしてるか分からなかったのが、今回の原因でした。
くそ、BULK SERVERめ!日本法人の申込なんだから、ロケールは日本にしとけや!!
でも、こういうことでハマったのは初めてだったから、良い経験にはなった。解決できて良かった。