2012-01-13 3 views
4

У меня проблема при выборе из таблицы, содержащей данные в формате utf-8 в MySQL с использованием java, в предложении WHERE мне нужно сравнить, если значение столбца равно java Строка, но они не совпадаютКак сравнить текст utf8 в запросе mysql с помощью java

"Select age from student where name = '"+stringVariable+"';" 

stringVariable иногда может быть на арабском языке, так и в этом случае они не совпадают

база данных utf8mb4 и соединение также между Java и базы данных UTF_8 и я не возникают проблемы при вставке или просто выборе данных, но проблема возникает при сравнении

Я попытался преобразовать строку, как это, и это также матч техника его подводит

byte[] b = stringVariable.getBytes("UTF-8"); 
String str = new String(b,"UTF-8"); 

Так кто имеет какое-либо решение для этого?!

Заранее благодарен

+2

конверсии вы показать как пример, вероятно, ничего не делать: вы кодирование в UTF-8 и декодирование от UTF-8. – jjmontes

ответ

6

Использовать параметры. Затем драйвер должен закодировать их правильно в соответствии со свойствами соединения.

PreparedStatement statement = connection.prepareStatement(
    "select age from student where name = ?");  
statement.setString(1, stringVariable); 

Кроме того, это также правильно экранирует специальные символы SQL (например, одинарные кавычки).

+0

Благодарим за помощь, но я попробовал и не работал, например, когда я попробовал этот пример String stringVariable = "Ãmina"; Подготовлено заявление о постановке = connection.prepareStatement ( «выберите возраст от студента, где name =?»); statement.setString (1, stringVariable); результирующий набор равен нулю, но когда я пытаюсь его использовать с нормальной строкой, он работает, поэтому у вас есть идея, почему это все еще происходит? – sabty

+0

Является ли ваша сортировка utf8_unicode_ci или utf8_unicode_cs (это defualt)? – jjmontes

+0

Моя сортировка - utf8mb4_unicode_ci, теперь она работает, используя подготовленное заявление, огромное спасибо. Я знал проблему, это было связано не только с запросом базы данных, и я опубликовал ее. – sabty

3

Вам не нужно ничего трансформировать. Водитель заботится обо всем. Попробуйте использовать prepared statement, а не конкатенацию строк. Это будет иметь дополнительное преимущество, избегая SQL injection attacks, и убедитесь, что ваш оператор работает, даже если строковая переменная содержит цитату.

+0

Спасибо, но я попытался использовать подготовленный оператор, и проблема все еще там, так что у вас есть идеи, почему?! – sabty

+0

Если они не совпадают, это, вероятно, потому, что они не являются одной и той же строкой. Попробуйте сделать тест, который вставляет некоторую арабскую строку, а затем искал ее, используя тот же экземпляр String и подготовленные операторы. –

+0

да, они разные, я также попробовал то, что вы сказали, чтобы вставить и выбрать, и это сработало, так что это означает, что все еще есть проблема в кодировке, но я не знаю, как преобразовать строку java в utf8, чтобы соответствовать таковой в базе данных или если есть еще одна проблема – sabty

1

Я решил эту проблему, она была связана не только с запросом к базе данных, но я получаю строку из АЯКСА запроса, так что я должен был расшифровать его из utf8 первых, а затем получить значение параметра с помощью

URLDecoder.decode(request.getQueryString(), "UTF-8") 

, а затем передать его в запрос, и я использовал подготовленное заявление, которое кодирует его в соответствии со свойствами соединения, как вы упомянули

Спасибо

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