首先,我正在使用:

Java 1.7.0_02
MySQL 5.1.50
ZendServer CE (if that matters)

我用来从Java连接到MySQL的JDBC驱动程序是com.mysql.jdbc.Driver。与数据库的连接正常。

我的连接字符串是:
jdbc:mysql://localhost:3306/table

为了解决这个问题,我添加了
?useUnicode=true&characterEncoding=UTF-8

连接字符串。

我正在使用Wikipedia转储,所有文本均采用MediaWiki格式,并且正在使用JWPL解析内容,该内容对我来说很不错,并且在从数据库中提取,解析和通过HTML显示的过程中, '丢失了'-'和单引号之类的字符,而是获取Earth���s而不是Earth's

经过一些测试之后,我得出结论,在MySQL查询和处理Java中的String之间没有正确地编码/解码字符,我得出了这个结论,因为数据库中的文本(存储为MEDIUMBLOB)具有正确的字符(如应有的字符)以及DB调用后Java中String的立即输出已损坏/丢失的字符(“?????”而不是日语字符等)。

我已验证System.getProperty("file.encoding");为UTF-8,因此JVM在正确打印时应该对字符串进行编码(除非JVM的UTF-8> UTF-16> UTF-8转换有问题)。

我还创建了一个带有UTF-8列的UTF-8表,并将数据移至数据库中以进行测试,这并不能解决任何问题。另一个尝试修复的方法是替换:
return result.getString("old_text");

将文本从“结果”集中拉到:
return new String(result.getString("old_text").getBytes("utf8"), "utf8");

这给了我与前面陈述相同的结果。

是否可以避免使用JDBC访问MySQL时字符数据的丢失,如果没有,是否可以通过一种方式处理字符并恢复适当的字符以用于显示?代替标准标点的两个和三个随机字符块会破坏用户体验。

编辑

请注意,数据库中的数据很好-字符存在,全部可见。通过phpMyAdmin访问日期将返回带有正确编码字符的数据。这个问题出现在MySQL和Java之间,也许与JDBC之间。我正在寻找一种设置或解决方法(该方法可行,因为我尝试过的方法对我而言没有用),可以防止丢失这些字符代码。

最佳答案

经过研究和阅读后,我开始找到解决我所遇到问题的解决方案。我不能说为什么,但是似乎是在Java中将MEDIUMBLOB转换为String类型。

这就是我从结果中返回文本的方式:

if (result.next())
    return result.getString("old_text");
else
    return null;

我过去对JDBC并没有做很多事情,也不知道有一个Blob类,因此我将代码更改为:
if (result.next()) {
    Blob blob = result.getBlob("old_text");
    InputStream is = blob.getBinaryStream();
    byte[] bytes = new byte[is.available()];
    is.read(bytes);
    is.close();

    return new String(bytes, "UTF-8");
}
else
    return null;

而且效果很好。

09-04 03:11
查看更多