2011年09月21日

Linuxの文字コード(ロケール)でハマる

文字コードのトラブルは大抵は文字化けがお約束なのだが、意外なことでハマってしまった。

ことの発端は、最近契約したレンタルサーバーに環境構築をして動作確認をしたときに、

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め!日本法人の申込なんだから、ロケールは日本にしとけや!!

でも、こういうことでハマったのは初めてだったから、良い経験にはなった。解決できて良かった。
posted by hana at 17:12| Comment(0) | TrackBack(0) | Linux関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック