有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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输出中,一切都被破坏了

有什么建议吗


共 (2) 个答案

  1. # 1 楼答案

    解决方案:

    SELECT CONVERT(CONVERT(CONVERT( column_name USING latin1) USING binary) using utf8) FROM...
    

    但它将您绑定到本机SQL。不能使用JPA查询。没有别的办法。只有MySQL知道如何转换数据输入数据库时转换的内容

  2. # 2 楼答案

    MySQL版本的latin1是CP1252:it uses the 5 bytes that CP1252 leaves undefined的扩展版本。不幸的是,当前的连接器/J有一个"bug",因为它使用原始的CP1252,而不是MySQL自己的版本。因此,不可能恢复编码使用这5个字节之一的字符串。修补Connector/J源以修复bug可以解决问题,但理想情况下应该将表迁移到UTF-8

    一种解决方法是使用JDBCgetBytes方法而不是getString从结果集中获取数据,这样可以绕过客户端库中的中断编码处理:

    String recovered = new String(resultSet.getBytes(1), "UTF-8");
    

    我不确定这是否对您有帮助,因为使用JPA和Hibernate,您已经完全脱离了JDBCAPI