我一直无法将Grails应用程序连接到亚马逊RDS上托管的MySQL数据库。它运行正常,我意识到俄罗斯的用户正在将西里尔字符输入到我的表单中,这导致MySQL数据库显示数据为????????。
所以,我converted the data in the database from Latin1 to UTF-8.(为什么哦,为什么UTF-8不是默认值?)
我在JDBC连接字符串的末尾添加了“?useUnicode = yes& characterEncoding = UTF-8”:
jdbc:mysql://myserver.amazonaws.com/mydatabase?useUnicode=yes&characterEncoding=UTF-8
现在,当grails连接到我的数据库时,我收到错误
java.io.StreamCorruptedException:无效的流标题:C2ACC3AD at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800) 在java.io.ObjectInputStream。(ObjectInputStream.java:297)
我看到用其他框架描述的解决方案的一种可能性是运行数据库连接
SET NAMES UTF8
连接数据库后立即。但是,我不知道如何强制Grails这样做,因为Grails处理它的数据库连接过程。有什么想法吗?
答案 0 :(得分:0)
要回答我自己的问题,这个问题是由一个域类存储的,它将一些元数据存储为HashMap。反过来,这些数据在数据库中被序列化。当数据库从LATIN-1移动到UTF-8时,由于字符编码的更改,此序列化数据已损坏。当访问数据时,应用程序然后以上述方式进行处理。
一旦我手动将该列中的所有数据设置为null,问题就解决了。
作为编码实践,最好避免在域对象中使用HashMaps的快捷方式。