Веб-служба Java в Glassfish 3.0.1 не вставляет китайские символы в базу данных MySQL

Я создал веб-службу, используя NetBeans 6.9.1, работающую в Mac OS на сервере приложений Glassfish 3.0.1. Этот метод принимает строковый аргумент китайских иероглифов. Он вставляет строку в таблицу базы данных MySQL. При пошаговом выполнении кода сервера в режиме отладки символы поступают правильно. Часы отладчика показывают параметр запроса ниже с китайскими иероглифами.

Query query = entityManager.createNativeQuery(QueryInsertWord);
query.setParameter(1, word);
query.executeUpdate();

ОДНАКО после вставки столбец таблицы базы данных имеет ??? вместо китайских иероглифов. Я предполагаю, что база данных MySQL совместима с UTF-8, потому что я могу вручную вырезать и вставлять китайские символы в тот же самый столбец с помощью инструмента управления базой данных Navicat.

ПУ выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>javaapplication1.Registration</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/myDatabase"/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
    </properties>
  </persistence-unit>
</persistence>

Я настроил ВСЕ пулы соединений Glassfish jdbc с дополнительными свойствами useUnicode=true и characterEncoding=utf8.

Помогите пожалуйста мне.


person user273565    schedule 20.02.2011    source источник
comment
При настройке экземпляра MySQL вы выбрали поддержку нескольких языков? По умолчанию при настройке экземпляра MySQL Server используется поддержка языка Latin-1.   -  person npinti    schedule 20.02.2011
comment
Это когда я впервые создаю базу данных? Я только что проверил свойства базы данных в Navicat, и набор символов моей базы данных по умолчанию — utf8, а сопоставление по умолчанию — utf8_bin.   -  person user273565    schedule 20.02.2011


Ответы (3)


Проблема может быть как минимум в двух местах:

  • ваше соединение не использует utf-8. Попробуйте передать characterEncoding=utf8 со строкой подключения
  • ваш веб-сервис не принимает UTF-8 (что делать здесь, вы должны предоставить дополнительную информацию)

Также убедитесь, что ваша база данных utf_general_ci (или аналогичная)

person Bozho    schedule 20.02.2011
comment
Информация о моем подключении через Navicat указывает на utf-8: Кодировка: Unicode (UTF-8) Включить набор символов MySQL: ДА Использовать сжатие: НЕТ Протокол: 10 - person user273565; 20.02.2011
comment
Я добавил предложенный вами параметр следующим образом: jdbc:mysql://localhost:3306/myserver?characterEncoding=utf8, но безуспешно. - person user273565; 20.02.2011
comment
Кроме того, набор символов моей базы данных по умолчанию — utf8, а сопоставление по умолчанию — utf8_bin. - person user273565; 20.02.2011
comment
Какую дополнительную информацию я могу предоставить, что было бы полезно? - person user273565; 20.02.2011
comment
@ user273565 конфигурации вашего веб-сервиса. Но прежде чем вы это сделаете, проверьте, что возвращает request.getCharaceterEncoding() (вы должны каким-то образом получить запрос, в зависимости от стека веб-службы) - person Bozho; 20.02.2011
comment
Я немного новичок. Где этот объект запроса, на который вы ссылаетесь? Я проверяю в методе веб-службы? Конфигурации моего веб-сервиса находятся в файле sun-web.xml или вы имеете в виду информацию о конфигурации Glassfish? - person user273565; 21.02.2011
comment
@user273565 user273565 Точно не помню, было что-то вроде MessageContext, через которое можно было получить запрос. Гугли вокруг :) - person Bozho; 21.02.2011
comment
Я гуглил, и это, похоже, больше относится к вещам типа get/post, а не к вызову веб-службы за слово. Я думаю, что проблема либо в пуле соединений Glassfish, либо в EntityManager в коде моего сервера, из которого я создаю запрос. - person user273565; 21.02.2011
comment
@user273565 user273565 поместите Filter перед сервером обработки веб-службы (должен быть один) и проверьте запрос там - person Bozho; 21.02.2011
comment
Спасибо. Я работаю над этим сейчас. Однако, поскольку отладчик показывает мне, что аргумент String в методе веб-службы имеет правильную кодировку, не является ли этот тест ненужным? - person user273565; 21.02.2011

Проблема решена. Кодировка символов веб-службы действительно UTF-8. База данных MySQL также имеет кодировку UTF-8. Проблема, ПОКАЗЫВАЕТСЯ, заключалась в модуле сохраняемости, который использует библиотеку Eclipse JPA 2.0. Я подозреваю это, потому что, когда я составил собственный запрос с рассматриваемым параметром как байт [], а не строку, правильные символы были сохранены в базе данных. Таким образом, теперь я передаю выражение "data.getBytes(Charset.forName("UTF-8"))" в объект параметра запроса, а не строку "данные". Поскольку данные действительно представлены в кодировке UTF-8, вызов getBytes правильно интерпретирует массив байтов. Перегруженный объект параметра передает массив байтов диспетчеру сущностей и его библиотеке постоянства, прежде чем он, наконец, достигнет базы данных MySQL. База данных MySQL имеет формат UTF-8 со столбцом типа LongText. Затем байты правильно вставляются в этот столбец. Пожалуйста, не стесняйтесь комментировать дальше, если кто-то считает, что я предполагаю что-то неправильное. Мне нужно было продолжить работу над проектом, и поэтому я не углубляюсь в этот вопрос в данный конкретный момент. Спасибо всем за помощь, особенно Божо, который направил меня в нужное русло.

person user273565    schedule 22.02.2011

Попробуйте с этим, добавьте строку запроса к URL-адресу jdbc

&characterEncoding=utf8&characterSetResults=utf8

В конце должно отображаться так:

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/DATABASE_NAME?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=utf8&amp;characterSetResults=utf8"/>
person Raugaral    schedule 11.10.2016