Ответ 1
Немного поздно, но это поможет вам:
DriverManager.getConnection(
"jdbc:mysql://" + host + "/" + dbName
+ "?useUnicode=true&characterEncoding=UTF-8", user, pass);
У меня есть сценарий с двумя базами данных 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
)?
Является ли проблема с чтением данных из первой базы данных или записью во вторую базу данных?
Немного поздно, но это поможет вам:
DriverManager.getConnection(
"jdbc:mysql://" + host + "/" + dbName
+ "?useUnicode=true&characterEncoding=UTF-8", user, pass);
Вы можете установить свойство file.encoding
вашего JVM на UTF-8, чтобы все чувствительные к локали/кодировке API рассмотрели декодированные строки как UTF8.
Например, вы можете установить его в своей командной строке, которая запускает ваше приложение Java:
java -Dfile.encoding=UTF-8 ....
Вы также можете обратиться к этому вопросу SO для полного объяснения настройки Tomcat.
В какой-то момент в цепочке кодированные байты UTF-8 декодируются с помощью Latin1. Из списка ваших настроек кажется, что это происходит на "character_set_server". Не зная, как эти значения были получены, их трудно интерпретировать.
Проверьте значение системного свойства "file.encoding". Если это не "UTF-8", тогда вам нужно явно указывать "UTF-8" в качестве кодировки символов всякий раз, когда вы декодируете байты в символы. Например, когда вы вызываете конструктор String
с byte[]
или используете InputStreamReader
.
Лучше явно указывать кодировки символов, а не полагаться на кодировку платформы по умолчанию.