随笔-67  评论-522  文章-0  trackbacks-0
    相信很多使用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的编码方式。希望此文能对大家有所帮助。
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
posted on 2010-04-05 16:37 菠萝大象 阅读(5919) 评论(17)  编辑  收藏 所属分类: Database

评论:
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-04-06 09:24 | E2
这个也叫做完全的解决方案,图片还要加上自己的标记,太那个了....  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-04-06 10:55 | 菠萝大象
@E2
这是针对MySQL数据库的中文编码问题,按照这样做,可以解决中文乱码的问题,我没有夸大,你觉得我哪里写的不好,可以提出来,但这么模糊的说"这个也叫做完全解决方案",我就不太明白了。另外,图片加上水印,是防盗转,没有别的意思。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-04-06 13:49 | Aspen
说白了,所有地方统一编码。
  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-04-06 13:56 | 菠萝大象
@Aspen
可以这么说,我当时遇到的问题其实只有两个。一是在my.ini文件的第二个字符集设置上,没有改成utf8。另一个就是工具有问题,生成的数据库和表对中文有BUG,改成Navicat,重新生成一遍就好了。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案[未登录] 2010-04-10 08:40 | roypayne
写的挺好的。鼓励一下楼主。谢谢分享。

另:有些人就会说风凉话。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-04-10 23:15 | 菠萝大象
@roypayne
谢谢支持,我是很用心在写,也欢迎真正的批评指正,而不是无目的的拍砖。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-10 15:43 | SoJog
建议把背景换下,这个看着太花了  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-10 15:45 | 菠萝大象
@SoJog
呃。。。还好吧,只是一个水印而已,而且很浅呐  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-10 15:55 | SoJog
@菠萝大象
这个还好呀,SSH2 ANNOTATION那几遍文章,汗。。。头昏  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-10 16:01 | 菠萝大象
@SoJog
啊,你千万别晕,晕了我可没医药费哦,呵呵。你就将就看吧,你不知道blogjava换图片好麻烦的,如果不加水印,有些盗文者很可耻,不加转载链接,这个我就很生气了,我欢迎转载,但不欢迎匿名转载。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-11 00:27 | zhhaojie
楼主真是很用心,谢谢你  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2010-09-13 10:10 | 菠萝大象
@zhhaojie
谢谢支持,我会努力的。  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2012-09-26 20:02 | luhong

还是不行  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2012-09-26 20:03 | luhong
以前解决过,现在又没法弄了。。。只是更改了my.ini文件,我没涉及到上层应用,就是在mysql dos client下插入查找数据,还是乱码问题,开始latin,乱码汉字是???,改成utf8,出现的更不知道是哪国繁体文  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2015-01-29 22:55 | wkl17
mysql Ver 14.14 Distrib 5.5.34, for Win32 (x86)
-------
我直接在[mysqld]下添加
default-character-set=utf8

default-character-server=utf8
,但之后就无法启动服务了..难道其他朋友修改my.ini后都能正常启动??

这是我执行 status命令后其中的几行:
Server characterset: latin1
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2015-01-30 08:44 | 菠萝大象
@wkl17
请你仔细看我文中写的,我并没有写要添加default-character-set=utf8或default-character-server=utf8这些,我只写了要改编码。你怎么会添加呢?
第一个地方要改的是[mysql],改它下面的default-character-set=utf8
第二个地方[mysqld],这下面改character-set-server=utf8
以下是我用status显示的结果
-------------------------------
mysql Ver 14.14 Distrib 5.5.36, for Win32 (x86)

Connection id: 1
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.5.36 MySQL Community Server (GPL)
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 43 sec
-----------------------------------

你的很明显是服务器端还是latin1字符集,而客户端却是gbk,你再好好检查一下  回复  更多评论
  
# re: JavaEE应用中MySQL中文乱码完全解决方案 2015-05-24 01:27 | Jared_liu
谢谢楼主分享,解决了乱码问题  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: