可以写但不能使用java和jdbc从MYSQL表中读取Unicode

时间:2015-09-16 18:59:30

标签: java mysql jdbc unicode

我可以使用java / jdbc成功写入mysql数据库表,用于unicode文本“приветмояработапрограммист”

当我在Windows 10上使用mysql命令提示符搜索数据库表时,我看到表中的确切文本。

但是当我使用java jbdc读回文本时,结果集中的文本如下

привÐμÑ,моÑÑабоÑ,апрограммиÑÑ,

我用来调用的网址是

jdbc:mysql://localhost/dbname?useUnicode=true&characterEncoding=utf-8

我使用以下代码

PreparedStatement ps = con.prepareStatement(SELECT_STATEMENT_EMAIL);

        ps.setString(1, idemail);
        ps.setString(2, password);


        ResultSet res = ps.executeQuery();

         if (res.next()) {
String description = res.getString("description");
    }

我已使用以下命令将数据库和数据库表转换为utf8

ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

将文件编码更改为UTF8。 最有可能的是,你有IntelliJ IDEA喜欢改变文件的编码......

enter image description here

答案 1 :(得分:0)

我担心你有两个问题。

привет м听起来像是Mojibake。

在尝试解码时,我得到привет мо� работа программи�т。黑色钻石通常来自输出页面上的错误<meta...>。但他们必须来自其他地方。

没关系。我看到яD18F。但8F,被视为latin1似乎是一个非打印字符,从而搞乱了2字节utf8代码的节奏,导致黑色钻石。

解码是BINARY(CONVERT(col USING latin1)),但我怀疑不能依赖。

Mojibake通常来自

  • 客户端中的字节在utf8(正常)中正确编码。
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • xx表中的列已声明为CHARACTER SET latin1。 (或者它可能是从表/数据库继承的。)(应该是utf8。)
  • 表格中的列可能是CHARACTER SET utf8,也可能不是SELECT col, HEX(col) FROM ... WHERE ...,但应该是这样。

所以,这给你两件事要修理。抱歉,我不认为表中的数据可以修复。但是,如果您提供я来显示该字符串,或者至少包含一些包含сTable User id (pk) | user_name 1 | a 2 | b 3 | c Table Post id (pk) | user_id (fk) 1 | 1 2 | 3 3 | 2 4 | 2 Table Block id (pk) | block_by (fk) | blocked_to (fk) 1 | 1 | 2 的字符串,我可以更深入地了解。