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

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

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

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

Позже, когда я вижу загруженные данные в своем веб-приложении, я вижу символ extrange, несмотря на <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)?

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

Ответы [ 3 ]

37 голосов
/ 16 июня 2012

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

DriverManager.getConnection(
           "jdbc:mysql://" + host + "/" + dbName 
           + "?useUnicode=true&characterEncoding=UTF-8", user, pass);
5 голосов
/ 08 апреля 2009

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

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

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

5 голосов
/ 08 апреля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...