2012-02-13 11 views
2

AmazonのRDSでホストされているMySQLデータベースにGrailsアプリケーションを接続する際に問題が発生しました。それはうまく働いていた、私はロシアのユーザーが私のフォームにキリル文字を入力していたことに気付きました。その結果、MySQLデータベースはデータを???????と表示しました。Grailsを使用してUTF-8 MySQLデータベースに接続

だから、Iましconverted the data in the database from Latin1 to UTF-8.(なぜああなぜUTF-8がデフォルトではない?)

私が追加した "?useUnicode = yesの& characterEncoding = UTF-8" 私のJDBCの終わりに接続文字列:今すぐ

jdbc:mysql://myserver.amazonaws.com/mydatabase?useUnicode=yes&characterEncoding=UTF-8 

、Grailsのが私のデータベースに接続するとき、私はエラー

java.io.StreamCorruptedException取得:無効なストリームヘッダ:JAVでC2ACC3AD をa.io.ObjectInputStream.readStreamHeader java.io.ObjectInputStreamで(ObjectInputStream.java:800) 。(ObjectInputStream.java:297)私は他でこれを解像度と説明を見てきました

一つの可能​​性フレームワークはデータベース接続を実行することです

SET NAMES UTF8 

データベースに接続した直後です。 Grailsがデータベース接続プロセスを処理するので、Grailsにこれを強制する方法はわかりません。何か案は?

+3

更新されたJDBC URLが必要なものでなければなりません。ある時点でいくつかのデータがデータベース内のオブジェクトとしてシリアライズされ、そのデータがもはや有効ではないように思われる。この例外は、特定のドメインクラスのクエリに対してのみ発生しますか? –

+0

はい。それはそれだった。私はシリアライズされたハッシュマップとして少しのメタデータを格納していたドメインクラスを持っていました。すべてのデータ列をnullに設定すると、問題は解決されました。今、私はちょうど良いものでそのメタデータをrepalceする方法を理解している...ありがとう! –

+0

あなた自身の質問に答えて、それを止めるには「unaswered」と表示してください。 – Danack

答えて

0

私自身の質問に答えるために、この問題は、HashMapとして少しのメタデータを格納していたドメインクラスによって引き起こされました。このデータは、次にデータベース内でシリアル化されました。データベースをLATIN-1からUTF-8に移動すると、このシリアル化されたデータが文字エンコーディングの変更により破損していました。データがアクセスされたとき、アプリケーションは次に上記の方法で呼び出された。

手動でその列のすべてのデータをnullに設定すると、問題は解決されました。

コーディングの慣行として、ドメインオブジェクトでHashMapsを使用することのショートカットを避けるのが最善の方法です。

関連する問題