Проблема записи строки JDBC MySQL UTF-8 - PullRequest
15 голосов
/ 23 марта 2011

Подключиться к БД:

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 - ???????

Проблема : В таблице у меня есть символы " ??????????? " в текстовом поле.

ожидаемая строка : Апарати
результат : ???????

Это какая-то магия
Я решил проблему ... Но все равно буду признателен, если smbd мне это объяснит.
Итак.

  1. Я добавил в мои /etc/mysql/my.cnf строки, предложенные Costis Aivalis
    результат тот же
  2. Я удалил строки из своего кода:
    query ="набор символов utf8";
    stat.execute (запрос);

это работает !!!:)

Ответы [ 2 ]

27 голосов
/ 23 марта 2011

Убедитесь, что ваша кодировка конфигурации MySQL определена правильно. Проверьте ваши настройки и правильность внесения изменений с помощью этих команд:

show variables like 'character%';

и show variables like 'collation%';

Добавьте эти строки в my.cnf или my.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+ отлично.

enter image description here

В вашей Java-программе подключитесь так:

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDatabase?useUnicode=true&characterEncoding=UTF-8","user","passwd");
4 голосов
/ 20 декабря 2016

Если вы получаете ?????????, добавьте параметр characterEncoding=utf-8 вместо useUnicode=true. Смотрите следующие примеры.

Для английского текста:

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

Для текста на русском языке:

String url = "jdbc:mysql://localhost:" + port + "/DBName&characterEncoding=utf-8&...";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...