相信很多使用MySQL数据库做开发的朋友,都或多或少的遇到过中文乱码的问题。大象根据项目实践,在此将自己的成功经验总结拿出来和大家分享。
    我使用的MySQL数据库版本是5.0.27,按以下几点处理,可以很好的解决中文乱码问题。

    1、数据库安装
    安装数据库时,有个服务器的字符集设置,这里不要使用默认的latin1字符集,而应该选择utf8字符集。在创建表的时候,还应该设定默认字符集编码为utf8
    2、数据库配置文件
    假设你在数据库安装时,采用了默认的字符集设置,或是使用了gb2312gbk等等,我们可以通过修改MySQL根目录下的my.ini文件来改变字符编码。
    打开my.ini文件,修改下图中画红线的部分。
请注意是utf8,而不是utf-8或UTF-8
    
    第二个红线部分的设置很关键,它主要用来指定表字段的默认字符集为utf8。大象试过,在所有设置都相同的情况下,这里如果保留默认的latin1,当在应用中向数据库插入数据时,就会出现乱码。而改成utf8则不会。
    3、数据库工具
    我觉得工具的选择很重要,现在关于MySQL的工具也有很多。我也用过很多,在这里我向大家推荐Navicat Lite for MySQL工具,界面如下
    
    界面简洁,功能强大,特别是能很好的处理中文字符。相信大家都能很快上手。我目前使用的是8.1版。
    4、Eclipse工作空间
    如今使用Eclipse工具做Java开发的占绝大多数,那么为了避免中文乱码的发生,Eclipse的工作空间也应该设置成UTF-8编码。
    
    5、页面字符编码
    我们已经将数据库与开发工具都统一成UTF-8的字符编码,那么对于展示层的JSP,我们也应该进行相应的设置。
    JSP页面顶部设置编码格式

    <%@ page contentType="text/html;charset=UTF-8" %>

    head之间加入meta设置

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

    另外,大象建议表单提交采用post方式。
    6、数据库连接
    连接数据库的地址中我们也应该加入字符设置,请看下面蓝色的字符。
 

    jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8

    7、容器配置文件
    还有最重要的一个步骤不能忘记,就是要在web.xml中加入字符过滤器。

    <!-- Filter 定义  -->
    <!-- Character Encoding filter -->
    <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 映射 -->
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    这里用到的是Spring的编码过滤器,我们可以直接拿来用。不过请注意forceEncoding这个参数,把它设置为true表示不管请求中的编码是什么格式,都将强制采用encoding中设置的编码方式。另外对于响应也将按照encoding指定的编码进行设置。
    通过以上几个步骤,应该可以完全解决使用MySQL数据库所带来的中文乱码问题。如果你按照这些设置做过后还是出现了乱码,请提出来,让我们一起来解决。
    大象不建议大家为了实现中文问题而采取gb2312gbk等编码方式,我们应该使用基于Unicode的编码。而UTF-8是目前互联网上使用最广泛的一种Unicode的实现方式,特别是目前JavaEE的企业级项目,都是基于互联网式的Web应用。所以我们应该使用这种统一的字符集编码方式。另外,对于SQLServerOracle数据库,不会出现像MySQL这样的乱码问题,但我们也应该坚持在开发过程中统一采用UTF-8的编码方式。希望此文能对大家有所帮助。
    本文为菠萝大象原创,如要转载请注明出处。