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);