2012-02-13 21 views
2

我一直無法將Grails應用程序連接到託管在Amazon RDS上的MySQL數據庫。它運行良好,我發現俄羅斯的用戶將西里爾字符輸入到我的表單中,導致MySQL數據庫顯示數據爲????????。使用Grails連接到UTF-8 MySQL數據庫

所以,我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:無效的流頭:C2ACC3AD 在JAV a.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800) 在java.io.ObjectInputStream中。(ObjectInputStream.java:297)是我見過描述爲解決這一與其他

一種可能性框架將運行數據庫連接

SET NAMES UTF8 

連接到數據庫後立即連接。但是,我不知道如何強制Grails執行此操作,因爲Grails在底層處理其數據庫連接過程。有任何想法嗎?

+3

更新後的JDBC URL應該是您所需要的。它看起來像某些數據在某些時候被序列化爲數據庫中的一個對象,並且該數據現在不再有效。這種異常只發生在某個域類的查詢上嗎? – 2012-02-13 18:09:37

+0

是的。就是這樣。我有一個域類,它將一些元數據存儲爲一個序列化的散列圖。一旦我將所有數據列設置爲空,問題就解決了。現在我只想弄清楚如何用更好的東西來重新表示元數據......謝謝! – 2012-02-13 18:21:16

+0

請回答你自己的問題,然後停止顯示爲'未回答'。 – Danack 2013-03-18 07:38:06

回答

0

爲了回答我自己的問題,這個問題是由一個存儲一些元數據作爲HashMap的領域類引起的。這些數據反過來在數據庫中被序列化。當數據庫從LATIN-1移到UTF-8時,由於字符編碼的改變,這個序列化的數據被破壞了。當數據被訪問時,應用程序然後以上述方式抽取。

一旦我手動設置該列中的所有數據爲空,問題就解決了。

作爲一種編碼習慣,最好避免在域對象中使用HashMaps的快捷方式。