Java PreparedStatement UTF - 8 проблема символов
у меня есть заявление:
PreparedStatement st;
и в моем коде я пытаюсь использовать st.метод setString.
st.setString(1, userName);
значение имени пользователя-şakça. методы setString изменяют "şakça " на"?akça'. Он не распознает символы UTF-8. Как я могу решить эту проблему?
спасибо.
4 ответов
количество способов, которыми это может быть испорчено, на самом деле довольно впечатляет. Если вы используете MySQL, попробуйте добавить characterEncoding=UTF-8
параметр до конца вашего URL соединения JDBC:
jdbc:mysql://server/database?characterEncoding=UTF-8
вы также должны проверить, что набор символов таблицы / столбца-UTF-8.
всякий раз, когда база данных меняет символ ?
, то это просто означает, что кодовая точка рассматриваемого символа полностью выходит за пределы диапазона кодировки символов, поскольку таблица настроена для использования.
Что касается причины проблемы:ç
находится в ISO-8859-1 диапазон и имеет точно такую же кодовую точку, как в UTF-8 (U + 00E7). Тем не менее, кодовая точка UTF-8 ş
лежит совершенно вне диапазон ISO-8859-1 ( U + 015F пока ISO-8859-1 только идет до U+00FF). БД не будет сохранять символ и заменять его на ?
.
Итак, я подозреваю, что ваша таблица БД все еще настроена на использование ISO-8859-1 (или в одной из других совместимых кодировок ISO-8859, где ç
имеет ту же кодовую точку, что и в UTF-8).
API Java/JDBC делает свою работу отлично в отношении кодировки символов (Java использует Unicode полностью) и JDBC DB кодировка соединения также настроена правильно. Если Java/JDBC неправильно использовал бы ISO-8859-1, то сохраненный результат был бы Åakça
(the ş
существует байт 0xC5
и 0x9F
представляет Å
и a
в ISO-8859-1 и байт 0xC3
и 0xA7
что представляет
Ã
и §
в ISO-8859-1).
setString методы изменения "şakça" на '?akça'
Как вы знаете, что setString изменяет это? Или вы видите содержимое в базе данных и решаете это?
возможно, база данных не настроена для UTF-8 или просто инструмент, который вы используете для просмотра элементов базы данных (SQL*PLUS для Oracle...) не способен diaplaying в UTF-8.
вы можете использовать запрос, как показано ниже, чтобы установить строки Unicode в подготовленном заявлении.
PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle
st.setString(1, userName);