Веб-сервис Java под Glassfish 3.0.1 не вставляет китайские символы в базу данных MySQL - PullRequest
1 голос
/ 20 февраля 2011

Я создал веб-сервис, используя 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.

PU выглядит следующим образом:

<?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.

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2011

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

0 голосов
/ 11 октября 2016

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

&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"/>
0 голосов
/ 20 февраля 2011

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

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

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

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