2012-02-13 49 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的快捷方式。