繁体   English   中英

使用JDBC从MySQL数据库中提取数据时,如何避免丢失标点符号?

[英]How do I avoid losing punctuation when pulling data from a MySQL database with JDBC?

首先,我正在使用:

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显示我“M失去字符,如‘ - ’和单引号,而是越来越Earth s ,而不是Earth's

在经过一些测试后,我已经归结为在MySQL查询和处理Java中的字符串之间没有正确编码/解码字符,我得出了这个结论,因为数据库中的文本(存储为MEDIUMBLOB )有正确的字符,就像它应该的那样,以及在DB调用破坏/丢失字符('?????'而不是日文字符等)后,Java中字符串的立即输出。

我已经验证了System.getProperty("file.encoding"); 是UTF-8所以JVM应该在正确打印时对String进行编码(除非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时是否可以避免这种字符数据丢失,如果没有,是否有办法处理字符并恢复正确的字符以便显示? 两个和三个随机字符块代替标准标点符号类型打破了用户体验。

编辑

一个小小的注释,数据库中的数据很好 - 字符存在,所有字符都可见。 访问日期thruogh phpMyAdmin返回具有正确编码字符的数据。 问题出现在MySQL和Java之间,也许是JDBC。 我正在寻找一个设置或一个解决方法(这是有效的,因为我试过的那些对我不起作用)可以防止丢失那些字符代码。

经过一些研究和阅读后,我找到了一个解决方案来解决我遇到的问题。 我不能说为什么,但它似乎一直在将MEDIUMBLOB转换为Java中的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;

而且效果很好。

我认为问题必须在于您对Blob中的字节进行编码和解码。 这可能是因为默认的字符集不是你想象的那样。

我建议您获取并放置字节数组,并在将字符串转换为字节数组时再显示指定UTF-8字符集。 不要依赖关于默认字符集的假设。

FWIW,找出JVM默认字符集的正确方法是查看Charset.defaultCharset()返回的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM