Java PreparedStatement UTF-8 символьная проблема - PullRequest
9 голосов
/ 30 сентября 2010

У меня есть подготовленное утверждение:

PreparedStatement st;

и в моем коде я пытаюсь использовать метод st.setString.

st.setString(1, userName);

Значение userName - şakça.Методы setString изменяют 'şakça' на '? akça'.Он не распознает символы UTF-8.Как я могу решить эту проблему?

Спасибо.

Ответы [ 4 ]

38 голосов
/ 01 октября 2010

Количество способов, которыми это можно испортить, на самом деле весьма впечатляет.Если вы используете MySQL, попробуйте добавить параметр characterEncoding=UTF-8 в конец URL-адреса вашего соединения JDBC:

jdbc:mysql://server/database?characterEncoding=UTF-8

Также следует проверить, что набор символов таблицы / столбца имеетUTF-8.

7 голосов
/ 30 сентября 2010

Всякий раз, когда база данных изменяет символ на ?, это просто означает, что кодовая точка рассматриваемого символа полностью выходит за пределы диапазона кодировки символов, так как таблица настроена для использования.

Что касается причины проблемы: ç находится в диапазоне 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 (существует ş байтов 0xC5 и 0x9F, что представляет Å и a в ISO-8859-1 и ç существуют байтов 0xC3 и 0xA7, которые представляют Ã и § в ISO-8859-1).

3 голосов
/ 30 сентября 2010

Методы setString изменяют şakça на '? akça'

Откуда вы знаете, что setString меняет это? Или вы видите контент в базе данных и решаете это?

Возможно, база данных не настроена для UTF-8 или просто инструмент, который вы используете для просмотра контекстов базы данных (SQL * PLUS для Oracle ...), не способен отображать UTF-8.

0 голосов
/ 29 июня 2015

Вы можете использовать запрос, как показано ниже, чтобы установить строки Юникода в подготовленном выражении.PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...