Spring MVC,MySQL和UTF-8

Lel*_*ele 4 mysql spring blob utf-8

我有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>
Run Code Online (Sandbox Code Playgroud)

在我的bean数据源中,我有:

 <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>
Run Code Online (Sandbox Code Playgroud)

CustomDataSource的位置是:

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

public class CustomDataSource extends BasicDataSource {

private void init() {
    addConnectionProperty("useUnicode", "true");
    addConnectionProperty("characterEncoding", "UTF-8");
}
Run Code Online (Sandbox Code Playgroud)

}

在我的布局页面中,我有:

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" charset="utf8" >
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

在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
....
Run Code Online (Sandbox Code Playgroud)

现在,当我在表格中写下这样一句话时:

This is a prove: àèìòù
Run Code Online (Sandbox Code Playgroud)

在Spring控制器中我打印在日志中:

...
logger.info("text --> " + text);
...
Run Code Online (Sandbox Code Playgroud)

并在eclipse控制台中打印的结果是正确的.

然后我将我的文本保存在带有数据源的mysql表中,如果我用bash连接到mysql,我可以读取保存在表中的正确文本.在下一步中,spring控制器通过查询从mysql中检索数据,但我可以从logger(eclipse控制台)看到字母"àèìòù"编码错误:

This is a prove: ?????
Run Code Online (Sandbox Code Playgroud)

所以我的网页结果是一样的.你能帮我吗?


我发现了错误:我用来保存文本的类型是BLOB,现在我使用TEXT类型,一切都很完美.抱歉!

sou*_*ica 17

确保您的JDBC连接也使用UTF8.例如:

jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8 
Run Code Online (Sandbox Code Playgroud)

例如,要使用带有Connector/J的4字节UTF-8字符集,请使用character_set_server = utf8mb4配置MySQL服务器,并将characterEncoding保留在Connector/J连接字符串之外.然后,Connector/J将自动检测UTF-8设置.

要覆盖客户端上自动检测到的编码,请使用用于连接服务器的URL中的characterEncoding属性.

有关详细信息,请参见5.4使用字符集和Unicode.