Перво-наперво, я использую:
Java 1.7.0_02
MySQL 5.1.50
ZendServer CE (if that matters)
Драйвер JDBC, который я использую для подключения к MySQL из Java, - com.mysql.jdbc.Driver
. Подключение к базе данных работает нормально.
Моя строка подключения:
jdbc:mysql://localhost:3306/table
И в попытках решить проблему, которую я имею, я добавил
?useUnicode=true&characterEncoding=UTF-8
к строке подключения.
Я работаю с дампом Википедии, весь текст в формате MediaWiki, и я анализирую контент с JWPL, который прекрасно работает для меня, и в процессе извлечения из базы данных, анализа и отображения через HTML я теряю такие символы, как '-' и одинарные кавычки, и вместо этого получаю Earth���s
вместо Earth's
.
После некоторого тестирования я свелся к тому, что символы не кодируются / декодируются должным образом где-то между запросом MySQL и обработкой строки в Java, я пришел к такому выводу, потому что текст в базе данных (хранится как MEDIUMBLOB
) содержит правильные символы, как и должно быть, и немедленный вывод String в Java после того, как в вызове БД были сломаны / пропущены символы («?????» вместо японских символов и т. Д.).
Я проверил, что System.getProperty("file.encoding");
- это UTF-8, поэтому JVM должна правильно кодировать строку при печати (если только что-то не так с преобразованием UTF-8> UTF-16> UTF-8 в JVM.
Я также создал таблицу UTF-8 со столбцами UTF-8 и переместил данные в нее в базе данных для тестирования, которое ничего не решало. Другая попытка исправить была заменить:
return result.getString("old_text");
, который извлекает текст из Result, установленного в:
return new String(result.getString("old_text").getBytes("utf8"), "utf8");
, который дал мне те же результаты, что и предыдущий оператор.
Можно ли избежать такой потери символьных данных при доступе к MySQL с помощью JDBC, если нет, то есть ли способ обработки символов и восстановления правильного символа для отображения? Два и три блока случайных символов вместо стандартных знаков препинания мешают работе пользователя.
EDIT
Небольшое примечание, данные в базе данных в порядке - символы присутствуют, все они и видимы. Доступ к дате через phpMyAdmin возвращает данные с правильно закодированными символами. Проблема возникает где-то между MySQL и Java, возможно, с JDBC. Я ищу настройку или обходной путь (который работает, поскольку те, которые я пробовал, не работают для меня), которые предотвратят потерю этих кодов символов.