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

标签 java mysql jdbc utf-8

首先,我正在使用:

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,我丢失了像“-”和单引号这样的字符,取而代之的是 Earths 而不是 Earth's

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

我已经验证 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 时,是否有办法避免这种字符数据丢失?如果没有,是否有办法处理这些字符并恢复正确的字符以供显示?用两个和三个随机字符 block 代替标准标点符号会破坏用户体验。

编辑

请注意,数据库中的数据很好 - 字符存在,所有字符都可见。通过 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;

而且效果很好。

关于java - 使用 JDBC 从 MySQL 数据库中提取数据时如何避免丢失标点符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674994/

相关文章:

java - NoSuchMethodError : javassist. CtClass.getDeclaredClasses()

php - 连接不同表的两个查询

java - MyBatis java 和 MySql 局部变量

java - 如何从抽屉导航中清除编辑文本

Java Swing 属性编辑器

mysql - MySQL : order by id or date? 的最佳实践问题

Java - 'field list' jdbc 错误中的未知列

java - 使用 JDBC 将 List<Object> 作为变量添加到数据库

java - Java 中 throw 和 throws 的区别?

mysql:选择语句给出错误