Spring MVC, MySQL и UTF-8 - PullRequest
       23

Spring MVC, MySQL и UTF-8

4 голосов
/ 15 сентября 2011

У меня проблема с UTF-8.Я использую Spring MVC и MySQL.

В Spring я настроил файл web.xml с:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

, и в моем источнике данных бобов у меня есть:

 <bean id="dataSource"
    class="it.roundtable.db.manager.CustomDataSource" init-method="init">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

где CustomDataSource:

import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

public class CustomDataSource extends BasicDataSource {

private void init() {
    addConnectionProperty("useUnicode", "true");
    addConnectionProperty("characterEncoding", "UTF-8");
}

}

На моей странице макета у меня есть:

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" charset="utf8" >

В MySQL у меня есть:

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.08 sec)

и

mysql> SHOW VARIABLES LIKE 'colla%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

и в my.cnf:

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock
default-character-set=utf8
....
[mysqld]
character-set-server=utf8
default-character-set=utf8
default-collation=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-client=utf8
skip-external-locking
....

Теперь, когда я написал в форме фразу вроде этого:

This is a prove: àèìòù

в Spring controllerЯ печатаю в журнале:

...
logger.info("text --> " + text);
...

, и результат, напечатанный в консоли Eclipse, правильный.

Затем я сохраняю свой текст в таблицу в MySQL с источником данных, и если я подключаюсь кMySQL с Bash, я могу прочитать правильный текст, сохраненный в моей таблице.На следующем шаге пружинный контроллер извлекает данные из mysql с помощью запроса, но из регистратора (консоли eclipse) я могу видеть, что буква «аи» ошибочно закодирована:

This is a prove: �����

, поэтому результатна моей веб-странице тоже самое.Не могли бы вы мне помочь?


Я обнаружил ошибку: тип, который я использовал для сохранения текста, был BLOB, теперь я использую тип TEXT, и все работает отлично.К сожалению!

Ответы [ 2 ]

17 голосов
/ 15 сентября 2011

Убедитесь, что ваше JDBC-соединение также использует UTF8. Например:

jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8 

Например, чтобы использовать 4-байтовые наборы символов UTF-8 с Connector / J, сконфигурируйте сервер MySQL с параметром character_set_server = utf8mb4 и оставьте символьное кодирование вне строки подключения Connector / J. Затем Connector / J автоматически определит настройку UTF-8.

Чтобы переопределить автоматически обнаруженную кодировку на стороне клиента, используйте свойство characterEncoding в URL-адресе, используемом для подключения к серверу.

См. 5.4 Использование наборов символов и Unicode для получения дополнительной информации.

0 голосов
/ 05 января 2018
jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8 

Это правильно , но, возможно, вам нужны строчные буквы «utf-8».как это

 jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=utf-8 

если ваша база данных развернута в Linux, система чувствительна к регистру

...