`
feiqitian
  • 浏览: 18836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL乱码解决方案

阅读更多
本文转载自http://hi.baidu.com/jlh21/blog/item/3d09cf18a667047ddab4bd84.html
    本文详细介绍了消除MySQL和jsp之间乱码的方法,我通过文章中的方法,成功的解决了乱码问题。
   
引用
自从以前学习JSP开始,中文乱码问题就一直不断,苦不堪言。这次在项目开始之前,我们要解决的第一个问题就是把mysql的中文乱码问题搞定。经过多天的努力,终于成功的解决了中文乱码问题,特写在这里,以备后用。 软件及环境:Windows XP(2000), j2sdk1.4.2, Tomcat 5.0.25, mysql 4.1, EMS Mysql Manager 2(方便建表,版本2.8.5.1),驱动为mysql-connector-java-3.1.4-beta-bin.jar。

目标:在该环境下,实现中文的正常显示,读取与插入数据库。

注:我只在此环境下测试通过,别的系统及不同版本未测试

要点:统一字符集(JSP页面编码,mysql建库时字符集选择,连接数据库URL,request设定等)

下面我以GBK为例讲解。如果要使用utf-8,只要在相应的GBK处换成utf-8即可

————————— 步骤1 以GBK字符集建库建表 ————————————-

我使用EMS来建mysql的数据库及表,因为它是图形界面,方便操作(就像SQL SERVER 2000中的企业管理器一样)。

建库时,从EMS菜单中选create Database…新建一个数据库,CharacterSet选gbk_bin(另一个gbk_chinese_ci不知道与这个有什么区别,我找资料也没有找到。如果你知道,请告诉我,我补充在这里)。不要把工具栏上有一个加号和数据库模样的图标当成新建数据库了,那个新注册一个已经存在的数据库。
后面建表时,也要选择同样的字符集。

建好后,此时不要用EMS向里面插入数据,否则你看到的中文依然是乱码。

————————— 步骤2 连接数据库的URL后加些参数 ——————————-

假设我新建的数据库是testdb,那么我连接数据库的url应该为:

jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk

此时要注意:如果我是把这个url写在JAVA代码中,就直接这样写。但如果是在xml配置文件中(如struts-config.xml,web.xml等),要把其中的&改为&才行,否则会出错。也就是:

jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk

————————— 步骤3 每个JSP页面都要声明该中文字符集 —————————-

在每个JSP页面的最上面都加上一句

<%@ page language=”java” contentType=”text/html;charset=GBK” %>

这样才能保证JSP页面中的中文显示正常

————————— 步骤4 加一个传递参数时设定request字符集的filter类 ———————–

因为网络中字符在传递的时候,都是统一以iso-8859-1的编码传递,所以我们必须对request重新设定字符集,才能正常显示中文。如果采用filter类来实现,我们不用在每次取中文参数时都要重新设定。

filter类的内容:


package com.strutsLogin.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;
    protected FilterConfig filterConfig = null;
    protected boolean ignore = true;
    public void destroy() {

      this.encoding = null;
      this.filterConfig = null;

  }
  public void doFilter(ServletRequest request,ServletResponse response,
      FilterChain chain)throws IOException, ServletException {

      if (ignore || (request.getCharacterEncoding() == null)) {
          String encoding = selectEncoding(request);
          if (encoding != null)
              request.setCharacterEncoding(encoding);
      }

    // Pass control on to the next filter
    chain.doFilter(request, response);

  }
  public void init(FilterConfig filterConfig) throws ServletException {

      this.filterConfig = filterConfig;
      this.encoding = filterConfig.getInitParameter("encoding");
      String value = filterConfig.getInitParameter("ignore");
      if (value == null)
          this.ignore = true;
      else if (value.equalsIgnoreCase("true"))
          this.ignore = true;
      else if (value.equalsIgnoreCase("yes"))
          this.ignore = true;
      else
          this.ignore = false;

  }
  protected String selectEncoding(ServletRequest request) {

      return (this.encoding);

  }

}//EOC

该代码来自于www.javawebstudio.com,特此感谢!

然后我们在web.xml中加一些配置,就可以了,配置如下:

<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>javawebstudio.struts_db.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>


放在web.xml的合适位置。一般在最后,<jsp-config>标签之前(如果有的话)

经过以上步骤,JSP和mysql的中文显示及插入就都正常了。在STRUTS中也正常。

但是,此时如果你用EMS或mysql的命令行控制台来看表中的数据,却发现它们都是????。这是怎么回事呢?

不用担心,只要我们运行下面的这几行命令,就能看到正常的中文了!

SET character_set_client = gbk;
SET character_set_connection = gbk;
SET character_set_database = gbk;
SET character_set_results = gbk;
SET character_set_server = gbk;

SET collation_connection = gbk_bin;
SET collation_database = gbk_bin;
SET collation_server = gbk_bin;

如果你用的是mysql的命令行,则直接输入就好。

如果是EMS,则在工具栏中有一个Show SQL Editor按钮,点一下,把上面的命令输入,再按一个”execute”的按钮,就行了!

而且在这种情况下,你可以甚至可以用中文名来建数据库,表名和字段名!!!!

—————————————————————————————————-

但是有一点要特别注意!

像GBK,UTF-8这样的名字,在mysql与JAVA中有不同的规定,写的时候要格外注意,否则会出错。

比如GBK,在JAVA中要写成GBK,但在mysql中要写成gbk(连接数据库的URL)

比如UTF-8,在JAVA中要写成UTF-8,但在Mysql中要写成utf8

其它的字集符也有类似的区别

其实之前的问题我都解决了,最后失败在一个&符号上,以后要记得了,凡是在url里面的&都最好写成&amp;,这下总算明白了xhtml标准中为什么这么规定了. 在web中,&因为是用来做转义的,所以有可能出错。

   
    另外,要解决Tomcat中url的乱码问题,可以在同tomcat的server.xml配置文件中的<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>中加入 URIEncoding="UTF-8"属性,即:
<Connector port="8080" protocol="HTTP/1.1" 
    connectionTimeout="20000" redirectPort="8443" 
    URIEncoding="UTF-8"/>

    文中说的EMS其全称是EMS SQL Manager,到百度搜就有下载地址,EMS 2007注册机我上传吧,在CSDN花了4分下到的,呵呵。 
分享到:
评论

相关推荐

    mysql乱码解决方案

    以下是对“mysql乱码解决方案”这一主题的深入探讨,旨在提供全面且权威的解决策略。 ### MySQL乱码成因分析 1. **系统环境设置**:操作系统、服务器或应用程序的默认字符集与MySQL数据库不一致。 2. **数据库配置...

    MySQL乱码解决方案数据库乱码

    #### 四、MySQL乱码解决方案 1. **检查MySQL服务器端字符集设置**: - 使用命令`SHOW VARIABLES LIKE 'character_set_%';`来查看当前MySQL服务器上的各种字符集设置。 - 如果发现任何一项字符集设置不正确(比如...

    jsp+servlet+mysql乱码解决的这天

    jsp+servlet+mysql乱码解决方案 jsp+servlet+mysql乱码解决方案是指在使用jsp+servlet+mysql开发web应用程序时,如何解决中文乱码问题的解决方案。该方案通过设置每个页面的编码格式为utf-8,控制器servlet中的请求...

    jsq+mybatis+mysql中文乱码解决方案

    JSQ+MyBatis+MySQL 中文乱码解决方案 中文乱码是 JSQ、MyBatis 和 MySQL 集成时常见的问题,解决这个问题需要从多方面入手。本文将从 JSP、MyBatis 和 MySQL 三个方面来解决中文乱码问题。 JSP 中文乱码解决方案 ...

    MySQL显示乱码解决方案

    ### MySQL显示乱码解决方案 #### 问题背景与现象 在MySQL数据库中,如果出现中文乱码的情况,将严重影响数据的准确性和可用性。本篇文章基于MySQL 5.5版本介绍如何解决显示乱码的问题,虽然文章针对的是特定版本,...

    jsp+mysql中文乱码解决方案集合

    ### jsp+mysql中文乱码解决方案集合 在使用JSP结合MySQL进行Web应用开发时,中文乱码问题一直是困扰开发者的一大难题。本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 ###...

    PHP+MySql中文乱码解决方案

    ### PHP+MySQL中文乱码解决方案 #### 一、概述 在使用PHP与MySQL进行Web开发的过程中,中文乱码问题是常见的一个问题。通常情况下,这主要是由于系统各部分(如PHP脚本、MySQL数据库、操作系统等)之间的字符编码...

    mysql乱码解决问题

    ### MySQL乱码问题解决方案 #### 一、问题背景 在MySQL数据库操作过程中,经常会遇到中文乱码的问题。尤其是在处理简体中文数据时,如果数据库或连接客户端的字符集设置不当,很容易导致显示乱码或者存储错误的...

    mysql乱码问题解决

    ### MySQL乱码问题解决方案 在处理数据库操作时,字符集编码问题经常会导致数据展示或存储过程中出现乱码现象。MySQL作为广泛使用的开源关系型数据库管理系统之一,在实际应用中也难免会遇到字符集不匹配导致的数据...

    MySQL数据库系统中文乱码问题及解决方案.pdf

    MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在存储、传输和显示过程中出现乱码的问题。这种问题的出现是由于字符集和编码方式的不兼容所致。 在...

    mysql中文乱码解决方案

    ### MySQL中文乱码解决方案 在使用MySQL数据库的过程中,可能会遇到中文显示乱码的问题。中文乱码问题通常是由于字符集设置不正确导致的。为了解决这个问题,我们需要从多个角度进行排查与解决,包括检查系统环境...

    MySQL中文乱码问题解决方案

    ### MySQL中文乱码问题解决方案 在使用MySQL的过程中,中文乱码问题是常见的问题之一,尤其是在数据库初始设置不当时,更容易出现此类问题。本文将详细介绍如何彻底解决MySQL中的中文乱码问题。 #### 一、理解中文...

    java插入mysql中文乱码解决

    ### Java插入MySQL中文乱码解决 #### 一、问题背景 在使用Java应用程序与MySQL数据库交互的过程中,常常会遇到一个令人头疼的问题:中文字符在存储到数据库时出现乱码现象。这种现象通常发生在使用JDBC(Java ...

    JSP乱码解决方案

    本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...

Global site tag (gtag.js) - Google Analytics