【问题标题】:Spring MVC, MySQL and UTF-8Spring MVC、MySQL 和 UTF-8
【发布时间】:2011-09-15 13:42:33
【问题描述】:

我对 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 数据源中,我有:

 <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 控制器中,我在日志中打印:

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

在eclipse控制台打印的结果是正确的。

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

This is a prove: �����

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


我发现了错误:我用来保存文本的类型是 BLOB,现在我使用 TEXT 类型,一切正常。 对不起!

【问题讨论】:

    标签: mysql spring utf-8 blob


    【解决方案1】:

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

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

    例如,要对 Connector/J 使用 4 字节 UTF-8 字符集,请将 MySQL 服务器配置为 character_set_server=utf8mb4,并将 characterEncoding 排除在 Connector/J 连接字符串之外。然后,Connector/J 将自动检测 UTF-8 设置。

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

    请参阅5.4 Using Character Sets and Unicode 了解更多信息。

    【讨论】:

    • 谢谢,但问题仍然存在,我的属性:jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/roundtable?useUnicode=yes&characterEncoding=UTF -8 jdbc.username=******* jdbc.password=*******
    • 如果设置断点并在调试器中查看字符串值会发生什么?
    • 什么字符串值?问题是当spring从mysql中检索数据时,事实上,当我打印到从带有重音字母的查询中接收到的视频数据时,这些字符是错误的。
    • 尝试为存储数据的表运行此命令:alter table xxxx convert to character set 'utf8' collat​​e 'utf8_general_ci';
    【解决方案2】:
    jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8 
    

    这是对的,但也许你需要小写字母“utf-8”。 像这样

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

    如果您的数据库部署在 Linux 中,系统区分大小写

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多