Как установить useUnicode = true и characterEncoding = свойства utf8 в Spring управляемом соединении MySQL JDBC

В настоящее время я создаю веб-приложение Spring MVC, и база данных является важной частью бэкэнд. Однако по какой-либо причине Spring отказывается обрабатывать данные как UTF-8. Поскольку представления, ресурсы и браузеры настроены на Unicode, а также таблицы в базе данных (а также чтение нескольких заданных вопросов), я установил, что проблема заключается в подключении к базе данных.

Драйверу JDBC должно быть предоставлено два элемента в connectionProperties: useUnicode (установлено в yes и characterEncoding (установлено в utf8). Оказывается, однако, невозможно.

JDBC - это bean, и как таковой конфигурируется через XML файл, например:

<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/<database>" />
<property name="username" value="<not telling>" />
<property name="password" value="<not telling>" />

Эта настройка преобразует все небуквенные символы, вытащенные из базы данных (например, стрелки или греческие буквы) в вопросительные знаки. Что, очевидно, неприемлемо.

Я попробовал несколько решений: задал URL-адрес JDBC как jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8, играл с файлом my.ini (и MySQL Workbench), чтобы заставить все в базе данных по умолчанию использовать utf8 charset и что-то, что вызвало наибольшую головную боль: добавив <property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. Оказывается, буквально невозможно установить два connectionProperties в пределах одного bean, потому что... там никакой разделительный символ не упоминается нигде (bean будет пытаться прочитать его как пытающийся установить yes;characterEncoding=utf8 как значение useUnicode). Поэтому мой вопрос: как я использую utf8?

Ответ 1

Проблема может быть вызвана указанием utf8, а не UTF-8. Из Использование наборов символов и Юникод:

При указании кодировок символов на стороне клиента используйте имена стиля Java. В следующей таблице перечислены имена наборов символов MySQL и соответствующие имена в стиле Java...

и utf8 отображает UTF-8. Попробуйте использовать следующий URL-адрес JDBC:

JDBC: MySQL://локальный: 3306/useUnicode = да & characterEncoding = UTF-8

Ответ 2

Вы пытались:

<property name="connectionProperties">
    <props>
        <prop key="useUnicode">yes</prop>
        <prop key="characterEncoding">utf8</prop>
    </props>
</property>

А также: вы пробовали простой Java-клиент (консольное приложение), который подключается к БД? Работает ли UTF-8 в этом случае?

Ответ 3

Обратите внимание, что если вы используете Spring Boot, вы можете сделать это с помощью свойств в application.properties вместо добавления дополнительных параметров в строки подключения:

Поместите это в application.properties:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

Ответ 4

У меня была такая же проблема при использовании Spring -boot + встроенного H2 + Hibernate, но проблема была в момент чтения SQL script. (data.sql) Кодировка в базе данных прерывалась каждый раз, когда я читал какой-либо внешний символ.

Добавление следующей строки в мое приложение .properties решило проблему:

spring.datasource.sqlScriptEncoding=UTF-8

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

Я нашел это решение здесь:

http://ufasoli.blogspot.com/2014/07/spring-boot-jpa-broken-encoding-on.html

Ответ 5

Я потратил время на создание таблиц utf-8. Без меня работала. Наконец, я изменил свой конфигурационный файл mysql, и он работает как шарм. Если вы находитесь в linux (я нахожусь в ubuntu, я уверен, что есть файл для Windows), откройте файл /etc/mysql/my.cnf и добавьте следующий код.

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

Не забудьте перезапустить службу mysql.