Проблемы чтения/записи данных UTF-8 в MySQL из Java с использованием JDBC-коннектора 5.1

У меня есть сценарий с двумя базами данных MySQL (в UTF-8), Java-кодом (Timer Service), который синхронизирует обе базы данных (первая форма чтения и запись/обновление на второй) и веб-приложение, которое позволяет изменять данные, загруженные во вторую базу данных.

Все доступ к базе данных осуществляется с помощью IBATIS (но я обнаружил, что у меня такая же проблема с использованием JDBC, PreparedStatement и ResultSet s)

Когда мой код Java считывает данные из первой базы данных, я получаю символы типа 'ó', когда это действительно должно быть 'ó'. Эти данные wroten без изменений во второй базе данных.

Позже, когда я вижу загруженные данные в своем веб-приложении, я вижу символ экранжа, несмотря на <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.

Если я декодирую данные, используя...

new String(data.getBytes("UTF-8"));

... Я правильно визуализирую персонажа (-). Но я не могу использовать это решение как общее правило, потому что, когда я изменяю данные с использованием формы веб-приложения, данные не обновляются в UTF-8 в моей второй базе данных (несмотря на то, что база данных UTF-8 и моя строка соединения использует characterEncoding, characterSetResults и useUnicode).

Из моего кода Java я получаю следующие настройки базы данных:

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

параметр character_set_server не может быть изменен, и я не знаю, что я делаю неправильно!

Как я могу читать данные UTF-8 из MySQL с помощью JDBC-коннектора (mysql-connector-java-5.1.5-bin.jar)?

Является ли проблема с чтением данных из первой базы данных или записью во вторую базу данных?

Ответы

Ответ 1

Немного поздно, но это поможет вам:

DriverManager.getConnection(
           "jdbc:mysql://" + host + "/" + dbName 
           + "?useUnicode=true&characterEncoding=UTF-8", user, pass);

Ответ 2

Вы можете установить свойство file.encoding вашего JVM на UTF-8, чтобы все чувствительные к локали/кодировке API рассмотрели декодированные строки как UTF8.

Например, вы можете установить его в своей командной строке, которая запускает ваше приложение Java:

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

Вы также можете обратиться к этому вопросу SO для полного объяснения настройки Tomcat.

Ответ 3

В какой-то момент в цепочке кодированные байты UTF-8 декодируются с помощью Latin1. Из списка ваших настроек кажется, что это происходит на "character_set_server". Не зная, как эти значения были получены, их трудно интерпретировать.

Проверьте значение системного свойства "file.encoding". Если это не "UTF-8", тогда вам нужно явно указывать "UTF-8" в качестве кодировки символов всякий раз, когда вы декодируете байты в символы. Например, когда вы вызываете конструктор String с byte[] или используете InputStreamReader.

Лучше явно указывать кодировки символов, а не полагаться на кодировку платформы по умолчанию.