2011-01-18 4 views
3

Как и в заголовке: я был отладчиком моего приложения, и поэтому в строке, где я помещал строки в переменную PreparedStatement, специальные символы меняются на «?». На самом деле я не знаю, где искать вещи, которые должны отремонтировать его, так что я не знаю, если требуется код .. Во всяком случае, я помещу некоторые здесь:Java PreparedStatement setString изменяет символы

PreparedStatement stm = null; 
String sql = ""; 

    try{ 
     sql = "INSERT INTO methods (name, description) VALUES (?, ?)"; 
     stm = connection.prepareStatement(sql); 
     stm.setString(1, method.getName()); 
     stm.setString(2, method.getDescription()); 
     //... 
    }catch(Exception e){} 

при отладке «имя» поля был прав в объекте метода, но после добавления его в переменную stm он изменил символы на «?».

Я нашел одну тему о подобном sitoatuin на SO, но не было никакого ответа, который мог бы мне помочь, так как я точно знаю, что есть что-то не так, чтобы добавить строку в оператор, а не в базу данных. Но я не знаю, что ..

Любые претензии?

PS. Я использую netbeans версии 6.7.1

EDIT: Я отлаживал стандартный отладчик netbeans и проверял состояние переменных перед добавлением строк в переменную stm. Я даже менял метод getName() на статическую строку со специальными символами. Так что, конечно, все в порядке с классом Method.

EDIT2: Я сделал еще одно испытание. Проверенная переменная stm и одно из ее свойств - «charEncoding», которое установлено на «cp1252». Итак, главный вопрос: как это изменить?

+0

Как ты проверить это? Какой инструмент вы использовали для проверки данных в базе данных? – skaffman

+0

Вы говорите, что возвращаемое значение 'method.getName()' изменилось после его вызова? –

+0

* Никогда * do 'catch (Exception e) {}' - если произойдет исключение, вы не узнаете, что это произошло и что пошло не так. По крайней мере, напечатайте трассировку стека: 'catch (Exception e) {e.printStackTrace(); } ' – Jesper

ответ

1

Звучит как вопрос кодировки для меня. Возможно, драйвер перекодирует ваши строки в соответствующую кодировку для поля/таблицы/схемы/базы данных, а не позволяет серверу это делать? Если вы пытаетесь сохранить символ, который не имеет представления в кодировке поля/таблицы/схемы/базы данных, это объясняет «?» персонажи.

1

Вы используете Oracle? У меня были аналогичные ситуации, если переменные среды, относящиеся к наборам символов, не были правильно определены.

По умолчанию соединение Oracle представляет собой ASCII (7-разрядные символы, A-Z, a-z, числа, знаки препинания, ...). Если вы используете какой-либо символ вне этого (например, европейские акценты, китайские иероглифы, ..), то вам нужно использовать что-то другое, кроме ASCII. UTF-8 лучше. Если вы этого не сделаете, ваши персонажи будут заменены на «?».

Вам нужно, чтобы ваш системный администратор установил это для вас. С другой стороны, посмотрите здесь:

http://arjudba.blogspot.com/2009/02/what-is-nlslang-environmental-variable.html

+0

Нет, я использую MySQL. – Seraphis

3

Обычно это происходит по using different charsets в разных местах. похоже, что вы получаете свой ввод в качестве UTF-8, преобразовывая его в другой chatset (возможно, ваша база данных настроена на что-то еще), которая разбивает специальный символ.

исправить это: использовать ту же кодировку всюду *. (Я бы рекомендовал использовать UTF-8)

* взглянуть на this или my answer to another thread (это примерно проблема в PHP, но в Java это почти то же самое)

+0

Но строки не проходят через БД. Они переносятся из одной переменной в другую в другом файле (класс java). Драйвер JDBC изменяет charset в переменной PreparedStatement? – Seraphis

+0

См. Мой ответ ниже. Возможно, что драйвер JDBC перекодирует String из UTF-8 Java в соответствующую кодировку для базы данных до отправки в базу данных. – dty

Смежные вопросы