Я пытаюсь прочитать строку UTF-8 из моей базы данных MySql, которую я создаю, используя:
CREATE DATABASE april
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Я составляю таблицу интереса, используя:
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text` longtext NOT NULL,
`date_created` timestamp DEFAULT NOW(),
PRIMARY KEY (`id`)
) CHARACTER SET utf8;
Если я select * from article
в утилите командной строки MySql, я получу:
OIL sands output at Nexen’s Long Lake project dropped in February.
Однако, когда я делаю
ResultSet rs = st.executeQuery(QUERY);
long id = -1;
String text = null;
Timestamp date = null;
while (rs.next()) {
text = rs.getString("text");
LOGGER.debug("text=" text);
}
вывод, который я получаю:
text=OIL sands output at Nexen’s Long Lake project dropped in February.
Я получаю соединение через:
DriverManager.getConnection("jdbc:" + this.dbms + "://" + this.serverHost + ":" + this.serverPort + "/" + this.dbName + "?useUnicode&user=" + this.username + "&password=" + this.password);
Я также пробовал вместо параметра useUnicode
:
characterEncoding=UTF-8
and
characterEncoding=utf8
Я тоже попробовал вместо строки text = rs.getString("text")
rs.getBytes("text");
String[] encodings = new String[]{"US-ASCII", "ISO-8859-1", "UTF-8", "UTF-16BE", "UTF-16LE", "UTF-16", "Latin1"};
for (String encoding : encodings) {
text = new String(temp, encoding);
LOGGER.debug(encoding + ": " + text);
}
// Which outputted:
US-ASCII: OIL sands output at Nexen��������s Long Lake project dropped in February.
ISO-8859-1: OIL sands output at Nexenââ¬â¢s Long Lake project dropped in February.
UTF-8: OIL sands output at Nexen’s Long Lake project dropped in February.
UTF-16BE: 佉䰠獡湤猠潵瑰畴琠乥硥滃ꋢ芬ꉳ⁌潮朠䱡步⁰牯橥捴牯灰敤渠䙥扲畡特�
UTF-16LE: 䥏⁌慳摮畯灴瑵愠⁴敎數썮겂蓢玢䰠湯慌敫瀠潲敪瑣搠潲灰摥椠敆牢慵祲�
UTF-16: 佉䰠獡湤猠潵瑰畴琠乥硥滃ꋢ芬ꉳ⁌潮朠䱡步⁰牯橥捴牯灰敤渠䙥扲畡特�
Latin1: OIL sands output at Nexenââ¬â¢s Long Lake project dropped in February.
Я загружаю строки в БД с помощью некоторого предопределенного sql в файле. Этот файл в кодировке UTF-8.
mysql -u april -p -D april < insert_articles.sql
Этот файл содержит строку:
INSERT INTO article (text) value ("OIL sands output at Nexen’s Long Lake project dropped in February.");
Когда я распечатываю этот файл в приложении, используя:
BufferedReader reader = new BufferedReader(new FileReader(new File("/home/path/to/file/sql_article_inserts.sql")));
String str;
while((str = reader.readLine()) != null) {
LOGGER.debug("LINE: " + str);
}
Я получаю правильный ожидаемый результат:
LINE: INSERT INTO article (text) value ("OIL sands output at Nexen’s Long Lake project dropped in February.");
Любая помощь будет принята с благодарностью.
Некоторые сведения о системе:
Я работаю на Linux (Ubuntu)
Редактирование:
* Отредактировано для указания ОС
* Отредактировано для детального вывода чтения файла ввода SQL.
* Отредактировано, чтобы указать больше о том, как данные вставляются в БД.
* Исправлено, чтобы исправить опечатку в коде и уточнить пример.