我真是很想把这个问题搞定。数据库乱码,我用的是TOMCAT+MSSQL2000
 我在JSP页面写入数据库再显示出来,数据库中的中文出现“????”的乱码,显示出来的页面也是“????”的乱码。
我这个是书上的例子,用一个JAVABEAN+JSP没有用SERVLET来向数据库中写入数据,再显示出来。
有三个文件:main.jsp/inquireOne.jsp/QueryBeanOne.java      数据库中:
我输入:sp_helpsort,
出现的是:Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive
其它的都是默认设置。
我的JSP页面都是用的BG2312码,我的三个文件是:
main.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head><body>
<h5> 使用ODBC数据源连接、查询数据库</h5>
<form action="inquireOne.jsp" method="post">
<br/>输入ODBC数据源的名字:
 <Input type=text name="ODBCDataSource" value="mymoon" size=8>输入表的名字
 <Input type=text name="tableName" value="score" size=8><br/>输入用户名称
 <Input type=text name="user"  size=6>输入密码:
 <Input type=text name="secret"  size=6><br/>
  输入插入学号:<Input type=text name="sno"  size=16>姓名:<Input type=text name="name"  size=8>文件:<Input type=text name="file"  size=16><br/>
 <Input type=submit name="g"  value="提交">
 </form>
 
</body>
</html>
inquireOne.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<%@page import="tom.QueryBeanOne"%>
<jsp:useBean id="database" class="tom.QueryBeanOne" scope="request"/>
<jsp:setProperty name="database" property="*"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head><body>
   <jsp:getProperty name="database" property="tableName"/>表查询到记录<br/>
    <%     out.println(database.getQueryResult());
%>
</body>
</html>
QueryBeanOne.java
package tom;
import java.io.UnsupportedEncodingException;
import java.sql.*;
public class QueryBeanOne {
    String ODBCDataSource="";
    String tableName="";  
    String user="";
    String secret="";   
    String queryResult="";
    String sno=null;
    String name="";
    String file="";
    public QueryBeanOne(){
     StringBuffer queryResult = new StringBuffer();
     try{
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      }catch(ClassNotFoundException e){
      queryResult=new StringBuffer();
      queryResult.append(" "+e);
     }    
    }
    public void setODBCDataSource(String s){
     ODBCDataSource = s.trim();
    }
    public String getODBCDataSource(){
     return ODBCDataSource;
    }
    public void setTableName(String s){
     tableName=s.trim();
    }
    public String getTableName(){
     return tableName;
    }
    public void setSecret(String s){
     secret=s.trim();
    }
    public String getSecret(){
     return secret;
    }
    public void setUser(String s){
     user=s.trim();
    }
    public String getUser(){  
     return user;
    }
    public void setSno(String s){
     sno= s.trim();
    }
    public void setName(String s){
     String str = null;
try {
str = new String(s.getBytes("GB2312"),"ISO-8859-1");    
} catch (Exception e) {
e.printStackTrace();
}
     name= str.trim();
    }
    public void setFile(String s){
     file= s.trim();
    }
    public String getQueryResult(){
     Connection con; 
     Statement sql;  
     ResultSet rs =null;     
        String source;
        String id;
        String password;    
     try{    queryResult=queryResult+"<table border=1>";
              Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");   
                source="jdbc:odbc:"+ODBCDataSource;
             id=user;
             password=secret;
         con=DriverManager.getConnection(source,id,password);  
          DatabaseMetaData metadata=con.getMetaData();
         ResultSet rs1=metadata.getColumns(null, null,tableName, null);
         queryResult=queryResult+"<tr>";
         while(rs1.next()){
         String clumnName=rs1.getString(4);
         queryResult=queryResult+"<td>"+clumnName+"</td>";
         }
         queryResult=queryResult+"</tr>";       
      sql=con.createStatement();     
        //name=name.getBytes("ISO-8859-1").toString();
        //String aa = (String)request.getParameter("str");
       // String bb = new String(aa.getBytes("iso-8859-1"),"GBK");
      if(sno!=null) 
      {   
      id="select * from score where 学号='"+sno+"'";
      rs=sql.executeQuery(id);
      if(rs.next())
     queryResult=queryResult+"<tr><td>"+sno+"重复已存在!"+"</td></tr>";
      else
      {   
      id="insert into score values('"+sno+"',N'"+name+"','"+file+"')";        
              sql.executeUpdate(id);
      }   
      }  
      id="select * from score";    
      rs=sql.executeQuery(id);  
      while(rs.next()){
      queryResult=queryResult+"<tr>";
     for(int k=1;k<=3;k++){  
     //alter database dbname collate Chinese_PRC_CI_AS
     //gb = new String(iso.getBytes("ISO-8859-1"),"GB2312"); 
     //new String(rs.getString(1).getBytes("ISO8859-1"));
      queryResult=queryResult+"<td>"+rs.getString(k)+"</td>";
     }
     queryResult=queryResult+"</tr>";
      }
      queryResult=queryResult+"</table>";
      con.close();
          }catch(Exception e){
           queryResult=queryResult+e;  }
return queryResult;
    }    
}
**************************************************************
大家一定要救救我啊。自学做毕业设计。。断肠人在CSDN求救。。

解决方案 »

  1.   

    首先介意:所有项目都统一编码,最好是采用utf-8 不要用gb2312..
    其次,检查数据库的配置,mysql默认的编码是latian  你重新配置一下,改成utf-8.
      

  2.   

    id="insert into score values('"+sno+"',N'"+name+"','"+file+"')";   
    这块你没处理乱码  当然插进去就是乱码了
      

  3.   

    如果直接在查询分析器里写插入语句,插入汉字也可以,没问题,但是为什么用JSP+JAVABEAN插入就不对了呢?从数据库往JSP页面上写东西显示是正常的,
    就是写入不正常。为什么??
      

  4.   

    再就是:如果有的JSP页面改成了UTF-8的话,我从数据库里读出来的东西就经常是乱码。用GB2312就没有这上问题。
    但写入的时候,不管我怎么折腾都是乱码。
      

  5.   

    再就是,过滤器对JAVABEAN有作用没有?
    是不是只对SERVLET有用?
      

  6.   

    web乱码
    http://blog.csdn.net/crazylaa/archive/2009/12/24/5066784.aspx