【问题标题】:How to correctly write UTF-8 strings into MySQL through JDBC interface如何通过 JDBC 接口将 UTF-8 字符串正确写入 MySQL
【发布时间】:2011-07-21 06:51:51
【问题描述】:

连接到数据库:

public DBSource(ConnectionInfo ci) throws
        ClassNotFoundException, InstantiationException,
        IllegalAccessException, SQLException
{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    String dbPath = String.format(
        "jdbc:mysql://%s:%d/%s?user=%s&password=%s&characterEncoding=utf-8&" + 
        "useUnicode=true", ci.host, ci.port, ci.dbName, ci.user, ci.password);
    conn = java.sql.DriverManager.getConnection(dbPath);
    prepareTables();
}

建表代码:

private void prepareTables() throws SQLException
{
    java.sql.Statement stat = conn.createStatement();

    String query = "set names utf8";
    stat.execute(query);

    query = "set character set utf8";
    stat.execute(query);

    query = "show variables like '%char%'";
    stat.execute(query);
    java.sql.ResultSet rs = stat.getResultSet();
    while (rs.next())
    {
        String k = rs.getString(1);
        String v = rs.getString(2);
        System.out.println(k + " - " + v);
    }
    
    query = "drop table if exists clt";
    stat.execute(query);
    query = "create table clt"
            + "("
            + "  id bigint not null"
            + ", text varchar(50) not null"
            + ") default character set utf8";
    stat.execute(query);
}

行插入:

public void visit(Insert i) throws SQLException
{
    String query = "insert into clt"
            + " (id, text) values (?, ?)";
    java.sql.PreparedStatement stmt = conn.prepareStatement(query);
    if (i.rowData.id == 12656697)
    {
        String toOut = "<<< " + Long.toString(i.rowData.id) + " - " + i.rowData.text;
        System.out.println(toOut);
    }
    int it = 0;
    stmt.setLong(++it, i.rowData.id);
    stmt.setString(++it, i.rowData.text);
    stmt.execute();
    stmt.close();
}

检查数据:

 public void checkText() throws SQLException
{
    java.sql.Statement stmt = conn.createStatement();
    String query = "select id, text from clt where id = '12656697'";
    stmt.execute(query);
    java.sql.ResultSet rs = stmt.getResultSet();
    while (rs.next())
    {
        String k = rs.getString(1);
        String v = rs.getString(2);
        String toOut = ">>> " + k + " - " + v;
        System.out.println(toOut);
    }
}

输出:

character_set_client - utf8
character_set_connection - latin1
character_set_database - latin1
character_set_filesystem - binary
character_set_results - utf8
character_set_server - utf8
character_set_system - utf8
character_sets_dir - /usr/share/mysql/charsets/

<<< 12656697 - Апарати
>>> 12656697 - ???????

问题:在表格中,我在文本字段中有“???????????”符号。

预期的字符串是Апарати
结果???????

这是某种魔法

我解决了一个问题......但如果有人可以向我解释一下,我仍然会感激不尽。

所以。

  1. 我已添加到我的 /etc/mysql/my.cnf 行,由 Costis Aivalis 建议
    结果一样
  2. 我从代码中删除了行:
    query = "设置字符集 utf8";
    stat.execute(查询);

它正在工作!!! :)

【问题讨论】:

标签: java mysql jdbc utf-8


【解决方案1】:

确保您的 MySQL 配置编码定义正确。使用以下命令检查您的设置和修改的正确性:

show variables like 'character%';

show variables like 'collation%';

将这些行添加到 my.cnfmy.ini

对于 MySQL 5.1.nn 和更高版本 5.5.29,您只需要这两行:

[mysqld]
character-set-server = utf8
character-set-filesystem = utf8

对于 MySQL 5.0.nn 及更早版本,请使用以下设置:

[client]
default-character-set=utf8


[mysql]
default-character-set=utf8


[mysqld]
default-character-set=utf8
character-set-server=utf8

使用MySQL-Workbench 进行设置可能更方便。 5+ 版本非常好。

在你的 Java 程序中像这样连接:

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd");

【讨论】:

  • 我的 my.cnf 中没有 [mysql] 组
  • 我也添加了 [mysql] 组...没有帮助:(
  • 你有什么 MySQL 版本和操作系统?
  • mysql-connector-java 5.1.14,mysql服务器版本:5.1.49
  • 太棒了!我的设置来自 MySQL 5.0.51 版。
【解决方案2】:

如果您得到?????????,请添加参数characterEncoding=utf-8 而不是useUnicode=true。请参阅以下示例。

英文文本:

String url =  "jdbc:mysql://localhost:" + port + "/DBName?useUnicode=true&...";

俄语文本:

String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 2011-09-06
    • 2013-01-26
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多