Struts+MySQL数据插入后,在MySQL里看是???的乱码,读出来也???,求终结解决方案
-------------------------------------------------
MySQL装的时候,选择了编码gbk ,这样 my.ini的 default character=gbk 了,即整个MySQL环境是GBK的了。
--------------------------------------------
在建库建表时,都指定编码为gbk,如 执行下面代码后,从MySQL图形工具MySQL和EMS SQLManager下看都正常显示中文。但再有JSP页面插入后,在MySQL图形工具
下看就是乱码???,再读出到JSP页面仍是乱码,显示的符号与数据库中一致(同样的 如 "用户名AA" 显示为 "×??áAA" )SET FOREIGN_KEY_CHECKS=0;
DROP DATABASE IF EXISTS `OnlineExam`;
CREATE DATABASE `OnlineExam`
    CHARACTER SET 'gbk'
    COLLATE 'gbk_chinese_ci';USE `OnlineExam`;DROP TABLE IF EXISTS `dept`;CREATE TABLE `dept` (
  `Dept_ID` int(11) NOT NULL auto_increment,
  `Dept_Name` varchar(20)  default NULL,
  `Dept_Detail` varchar(50) default NULL,
  `Dept_Admin` varchar(20)  default NULL,
  PRIMARY KEY  (`Dept_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='InnoDB free: 8192 kB';INSERT INTO `dept` (`Dept_ID`, `Dept_Name`, `Dept_Detail`, `Dept_Admin`) VALUES 
  (1,'信息中心','信息中心','admin'),
  (2,'经理办公室','经理办公室','yangpool'),
  (3,'党委','党委','fxfeiyi'),
  (4,'组织部','组织部',NULL),
  (5,'宣传部','宣传部',''),
  (6,'团委','团委',NULL),
  (7,'纪检部','纪检部',NULL),
  (10,'工会','工会',NULL),
  (26,'保卫科','保卫科','');------------------------------------------------
JSP页面设置:<%@ page contentType="text/html; charset=GBK"%>          //说明
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html>
<head>
<title>新用户注册</title>
<meta http-equiv="Content-Type" content="text/html;charset=GBK">
<LINK href="Img_itbook/v1.1.css" rel=stylesheet type=text/css>
</head>页面顶部另外还有一种写法,在eclispe正常,不知和上面有区别否:<%@ page import="com.fxfeiyi.frame.database.DB,java.sql.*" pageEncoding="GBK"%> //-----------------------------------------------
连接MySQL的JAVA关键代码:package com.fxfeiyi.frame.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DBCon {

  public static Connection getConnection()
  {
   String DB="OnlineExam";
   String USER="root";
String PWD="000";
String DBDriver="com.mysql.jdbc.Driver";  
String DBURL="jdbc:mysql://localhost:3306/"+DB+"?user="+USER+"&password="+PWD;
      //"&useUnicode=true&characterEncoding=GBK";
//注意DBURL处注释处,是否加上这段代码,都没解决插入乱码问题。
      Connection conn = null;      try
      {
          Class.forName(DBDriver);
          conn = DriverManager.getConnection(DBURL);
      }
      catch (SQLException ex)
      {
          System.out.println(ex.getMessage() + "SQL语句执行错误!");
      }
      catch (ClassNotFoundException ex)
      {
          System.out.println(ex.getMessage() + "无法找到数据库驱动程序!");
      }
      return conn;
  }
}
-----------------------------------------------
眼下正在用Struts做个考试系统,练习使用Struts,并尝试做一些通用模块,如
表单数据不写SQL自动插入、更新、删除等等,目的是以后开发节省时间。知道持久层已经实现这些东西,但还是想
先自己实现一下,不失是一种提高自己的方式。可目前中文问题,真是一个门槛!!
最近做了许多测试,各种情况组合,一时解决不了。请有经验者给个方案。当然更希望 MYSQL环境的编码 和 数据库及表的编码 都是统一的,我设置成GBK,最好在MYSQL图形工具下看到的是中文,
这样便于编程调试。

解决方案 »

  1.   

    建议你配个Filter
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class CharSetFilter implements Filter{
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    request.setCharacterEncoding("GBK");
    response.setContentType("text/html;charset=GBK");
    chain.doFilter(req, res);
    }
    public void init (FilterConfig config) throws ServletException
    {}
    public void destroy (){}
    }
      

  2.   

    最根本的解决方法:
    找到MYSQL安装目录下my.ini文件,加上下面这句
    [mysqld]
        default-character-set=utf-8
    保存,重新启动MYSQL
      

  3.   

    default-character-set=utf-8
    我试验过,感觉不如GBK好,utf-8显示中文在MySQL IDE下显示数据是乱码。
    加了个
    <controller processorClass="com.fxfeiyi.frame.filters.FilterRequestProcessor"/>到struts-config.xml,struts action乱码解决。package com.fxfeiyi.filters;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import fr.improve.struts.taglib.layout.workflow.LayoutRequestProcessor; public class FilterRequestProcessor extends LayoutRequestProcessor {
    public FilterRequestProcessor() {

    }
    protected boolean processPreprocess( 
              HttpServletRequest request,  
              HttpServletResponse response ){ 
    try{  
    request.setCharacterEncoding("GBK");
    }
    catch(Exception ex){
    System.out.println("Encoding error!");   
    }  
    return true;
    }
    }
      

  4.   

    错了,上面的是我自己有改动的,这个好理解。
    package com.fxfeiyi.frame.filters;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.RequestProcessor; public class FilterRequestProcessor extends RequestProcessor {
    public FilterRequestProcessor() {

    }
    protected boolean processPreprocess( 
              HttpServletRequest request,  
              HttpServletResponse response ){ 
    try{  
    request.setCharacterEncoding("GBK");
    }
    catch(Exception ex){
    System.out.println("字符集设置失败");   
    }  
    return true;
    }
    }
      

  5.   

    光加filter可能还不够,最好把你的连接后面添上useUnicode=true;
    characterEncoding=GBK