2017-02-21 29 views
1

Итак, я настроил спящий режим с Wildfly и MySql.Java EE, Hibernate, MySql UTF-8 запрос не работает

Querying работает, но имеет проблемы с запросом на имена символов UTF-8.

На MySql:

SELECT * FROM users WHERE firstname = "ნიკა"; 

Не приводит пустое множество.

В то время как в Java:

Session session = HibernateUtils.getSession(); 

String name = request.getParameter("name"); 

CriteriaBuilder builder = session.getCriteriaBuilder(); 

CriteriaQuery<UsersEntity> query = builder.createQuery(UsersEntity.class); 
Root<UsersEntity> usersRoot = query.from(UsersEntity.class); 
query.select(usersRoot) 
     .where(builder.equal(usersRoot.get("firstname"), name)); 

List<UsersEntity> list = session.createQuery(query).list(); 

session.close(); 

writeUsers(list, response.getWriter()); 

Результаты в пустом наборе при запросе localhost:8080/main?name=ნიკა

Как это исправить?

UPDATE:

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

UPDATE 2: Результаты

Этот код в показ вопросительные знаки в браузере:

response.getWriter().write("ნიკა ჩხარტიშვილი"); 

Хотя это один работает правильно:

response.setCharacterEncoding("UTF-8"); 
response.getWriter().write("ნიკა ჩხარტიშვილი"); 

При запросе базы данных с этим запросом База данных SELECT * FROM users WHERE username='ნიკა' получает вопросительные знаки вместо ნიკა (Это то, что sh происходит в проводах).

Я думаю, что это проблема wildfly, потому что он получил UTF-8 правильно, но отправляет вопросительные знаки, если только это не указано для отправки UTF-8.

+0

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

+0

@davejal Hardcoding не работает. – nikartix

+0

В вашем примере SQL используется 'firstname =" ნიკა "'. Пример вашего URL использует 'localhost: 8080/main? Name = ნიკა'. Что произойдет, если вы закроете сеанс после вызова' writeUsers'? Что делает вызов 'writeUsers'? –

ответ

0

Я установил ее.

Первое подключение к клиенту не было UTF-8. Fixed его:

response.setCharacterEncoding("UTF-8"); 

Это работает для одного сервлета, хотя. Обновлено wildfly standalone.xml файла конфигурации

<servlet-container name="default" default-encoding="UTF-8"> 
    <jsp-config/> 
    <websockets/> 
</servlet-container> 

Добавлен default-encoding свойство servlet-container, теперь каждый ответ будет по умолчанию UTF-8 кодировку.

JDBC Связь не была UTF-8.

Фиксированный с обновлением connection.url, добавлена ​​

?useUnicode=yes&amp;characterEncoding=UTF-8 в конце.

<property name="connection.url">jdbc:mysql://localhost:3306/cnick?useUnicode=yes&amp;characterEncoding=UTF-8</property> 

Когда в последний раз, когда я сделал это, я думал, что это не работает, потому что я не запрашивая в базе данных. Теперь он работает.

0

Это связано с тем, что URL-адреса можно отправлять только через Интернет, используя набор символов ASCII.

Если ваш запрос на сервер от Javascript, вы должны кодировать имя значение с encodeURIComponent («ნიკა»), ваш вызов должен выглядеть следующим образом:

localhost:8080/main?name=%E1%83%9C%E1%83%98%E1%83%99%E1%83%90 

Если вы просто вставив URL к brownser просто сделать это, как обычно

localhost:8080/main?name=ნიკა 

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

//String name = request.getParameter("name"); 
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); 
0

Если вы получаете знаки вопроса при чтении из базы данных MySQL см here

  • байты должны храниться не кодируются как utf8/utf8mb4. Почини это.
  • Столбец в базе данных - CHARACTER SET utf8 (или utf8mb4). Почини это.
  • Кроме того, убедитесь, что соединение во время чтения - UTF-8.

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

Я уверен, что любое упоминание о "ISO-8859-1" будет неправильным. %E1%83%9C - это urlencoding . Получение nameдолжно отменить это для вас, без каких-либо действий с вашей стороны. Следовательно, выполнение getBytes("ISO-8859-1") запрашивает ნიკა, который должен быть предоставлен в этой кодировке. Но эта кодировка охватывает только Западную Европу. Я предлагаю попробовать

new String(request.getParameter("name").getBytes("UTF-8")); 

(Это Java? Или что?)

+0

Когда я выбираю из командной строки, никаких вопросительных знаков нет. И выберите, где предложение работает правильно. Я думаю, что это проблема связи. – nikartix

+0

Я только что проверил другое. Я зарегистрировал имена на сервере, и они правильно закодированы, но при отправке в браузер они подвергаются вопросительному знаку. – nikartix

+0

В MySQL отсутствует соединение _direct_ из MySQL. Это _must_ будет проходить через некоторое приложение, и это приложение должно нуждаться в исправлении. –

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