使用Java、Hibernate和JPA将utf 8从1转换为UTF8
我有一个charset=latin1和排序规则latin1_-swedish_-ci的数据库。用户在这个连接中输入了UTF-8字符(希腊字符),在PHP中他可以很好地读取所有内容
但是当我尝试使用JAVA+JPA+Hibernate(所有最新版本)读取数据库时,字符完全被破坏了
请注意,我已经用以下方法尝试了我的jdbc字符串:
...?useUnicode=true&characterEncoding=latin1&connectionCollation=latin1_swedish_ci
...?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_general_ci
...?characterSetResults=ISO8859_1
...and combinations of those
但我还是看不懂这些字
我能做到的最好的方法就是使用:
byte ptext[] = myString.getBytes(windows-1252);
String fixed = new String(ptext, UTF_8);
与:
?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_general_ci
但eclipse的输出中仍然有许多字符是“?”在log4j输出中,一切都被破坏了
有什么建议吗
# 1 楼答案
解决方案:
但它将您绑定到本机SQL。不能使用JPA查询。没有别的办法。只有MySQL知道如何转换数据输入数据库时转换的内容
# 2 楼答案
MySQL版本的latin1是CP1252:it uses the 5 bytes that CP1252 leaves undefined的扩展版本。不幸的是,当前的连接器/J有一个"bug",因为它使用原始的CP1252,而不是MySQL自己的版本。因此,不可能恢复编码使用这5个字节之一的字符串。修补Connector/J源以修复bug可以解决问题,但理想情况下应该将表迁移到UTF-8
一种解决方法是使用JDBC
getBytes
方法而不是getString
从结果集中获取数据,这样可以绕过客户端库中的中断编码处理:我不确定这是否对您有帮助,因为使用JPA和Hibernate,您已经完全脱离了JDBCAPI