Не удается сохранить содержимое UTF-8 в MySQL с помощью Java PreparedStatement - PullRequest
5 голосов
/ 09 марта 2012

По какой-то странной причине я не могу добавить данные UTF-8 в свою базу данных MySQL.Когда я ввожу нелатинский символ, он сохраняется как ?????.Все остальное хранится нормально.Так, например, «это пример® ™» хранится нормально, но «和 英 辞典» хранится как «????».

URL-адрес соединения в порядке:

private DataSource getDB() throws PropertyVetoException {
    ComboPooledDataSource db = new ComboPooledDataSource();
    db.setDriverClass("com.mysql.jdbc.Driver");
    db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8");
    db.setUser("...");
    db.setPassword("...");
    return db;
}

Я использую PreparedStatement, как и следовало ожидать, я даже попытался ввести «set names utf8», как кто-то предложил.

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
        conn = db.getConnection();

        stmt = conn.prepareStatement("set names utf8");
        stmt.execute();
        stmt = conn.prepareStatement("set character set utf8");
        stmt.execute();

                    ... set title...
        stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)");
        stmt.setString(1,title);

        stmt.execute();
    } catch (final SQLException e) {
    ...

С самой таблицей все в порядке.

Default Character Set: utf8
Default Collation: utf8_general_ci
...
Field title:
Type text
Character Set: utf8
Collation: utf8_unicode_ci

Я проверил это, введя Unicode (в частности, "和 英 辞典") через графический редактор, а затем выбрав из таблицы - и он был возвращен просто отлично.Так что это похоже на проблему с JDBC.

Что мне не хватает?

Ответы [ 6 ]

5 голосов
/ 07 января 2014

В строке подключения JDBC вам просто нужно установить кодировку кодировки следующим образом:

jdbc: mysql: // localhost: 3306 / dbname? CharacterEncoding = utf8

3 голосов
/ 01 октября 2014

Используйте stmt.setNString(...) вместо stmt.setString(...).
Также не забудьте проверить сопоставление столбцов на стороне базы данных.

3 голосов
/ 10 марта 2012

На сервере mysql есть 2 точки для проверки правильности установки кодировки UTF-8.

Уровень базы данных

Это получается при его создании:

CREATE DATABASE 'db' CHARACTER SET 'utf8';

Уровень таблицы

Все таблицы должны быть также в UTF-8 (что, как вам кажется)

CREATE TABLE  `Table1` (
    [...]
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

Важной частью является DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci

Наконец, если ваш код неправильно обрабатывает utf8, вы могли бы заставить JVM использовать кодировку utf8изменив настройки при запуске:

java -Dfile.encoding=UTF-8 [...]

или изменив переменную среды

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8"

или программно с помощью:

System.setProperty("file.encoding" , "UTF-8");

(последний можетне имеет желаемого эффекта, поскольку JVM кэширует значение кодировки символов по умолчанию при запуске)

Надеюсь, что помогло.

1 голос
/ 10 марта 2012

Если вы войдете в базу данных MySQL и запустите show variables like 'character%'; это может дать некоторое представление.

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

0 голосов
/ 03 февраля 2019

добавьте в конце URL вашего соединения с БД - (больше ничего не нужно), напр.

0 голосов
/ 06 декабря 2016

Также проверьте локаль -a в Ubuntu по умолчанию. Ubuntu работает с локалью en_us и не имеет другой установленной локали. должен указывать символEncoding = utf8 при подключении через JDBC.

...