javaBean连接MySQL数据库字符编码问题

zsw_2009 2009-12-29 02:35:56
一个模糊查询数据库的例题。网页是GB2312编码的,MySQL数据库是utf-8_unicode_ci.应该是编码问题,查询结果显示不出来为什么?这么修改。

Bean文件 KeyWordQuery.java

package database.operation;
import java.sql.*;
public class KeyWordQuery
{ String ziduan="", //字段
keyWord=""; //关键字
StringBuffer queryResult;
public KeyWordQuery()
{ queryResult=new StringBuffer();
try{ Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){ }
}
public void setKeyWord(String s)
{ keyWord=s.trim();
try{ byte bb[]=keyWord.getBytes("ISO-8859-1");
keyWord=new String(bb,"gb2312");
}
catch(Exception e){}
}
public String getKeyWord()
{ return keyWord;
}
public void setZiduan(String s)
{ ziduan=s.trim();
try{ byte bb[]=ziduan.getBytes("ISO-8859-1");
ziduan=new String(bb,"gb2312");
}
catch(Exception e){}
}
public String getZiduan()
{ return ziduan;
}
public StringBuffer getQueryResult()
{ String condition="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";
StringBuffer str=f(condition);
return str;
}
public StringBuffer f(String condition)
{ StringBuffer str=new StringBuffer();
Connection con;
Statement sql;
ResultSet rs;
try { String uri="jdbc:mysql://127.0.0.1/factory";
con=DriverManager.getConnection(uri,"abc","abc");
sql=con.createStatement();
rs=sql.executeQuery(condition));
str.append("<table border=1>");
str.append("<th width=80>"+"雇员号");
str.append("<th width=80>"+"姓名");
str.append("<th width=80>"+"出生日期");
str.append("<th width=80>"+"薪水");
while(rs.next())
{ str.append("<tr>");
str.append("<td>"+rs.getString(1)+"</td>");
str.append("<td>"+rs.getString(2)+"</td>");
str.append("<td>"+rs.getDate(3)+"</td>");
str.append("<td>"+rs.getString(4)+"</td>");
str.append("</tr>");
}
str.append("</table>");
con.close();
}
catch(SQLException e)
{ System.out.println(e);
}
return str;
}
}


keyWord.jsp :

<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="database.operation.*" %>
<jsp:useBean id="base" class="database.operation.KeyWordQuery" scope="request" />
<jsp:setProperty name="base" property="ziduan" param="ziduan"/>
<jsp:setProperty name="base" property="keyWord" param="keyWord"/>
<HTML><BODY><Font size=2>
<FORM action="" method=post name=form>
选择:<Select name="ziduan">
<Option value="name">姓名
<Option value="number">雇员号
</Select>
含有:<INPUT type="text" name="keyWord">
<Input type=submit name="g" value="提交">
</Form>
<jsp:getProperty name="base" property="ziduan"/> 含有关键字
<jsp:getProperty name="base" property="keyWord"/> 的记录:
<BR><jsp:getProperty name="base" property="queryResult"/>
</Font></BODY></HTML>
...全文
421 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
sebatinsky 2009-12-29
  • 打赏
  • 举报
回复
楼主问题似乎看上去有点冒失,呵呵,对不起,说得有点直白了,首先,你应该一步一步的去解决问题,这个才是最重要的,得到乱码也好,得到的是正常字符,只是其中不知道哪里出现问题也好,这里的数据库编码,页面编码,没有注意过,或者是有点迷糊了,不知道有直接关系没,

说说解决之道吧,首先,查找数据库,查出来的是乱码还是正常的,这里的java文件的编码最好跟页面编码一致,转码,是最不提倡的,因为会根据环境变化出现意想不到的问题。

其次,解决上面的之后,出现正常的了,然后,页面访问的时候,设个断点,这个很重要,断点调试啊,看,后台查出来的是乱码,还是正常的,后台查出来的,是乱码,可想而之,如果是正常的,只是页面显示的时候出现乱码,那就得看中间传输出现了什么问题了。
TzSword 2009-12-29
  • 打赏
  • 举报
回复

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyTest{
private static String drive = "org.gjt.mm.mysql.Driver";// 这里是驱动字符 串
private static String url = "jdbc:mysql://localhost:3306/a";// 这里是连接地址
private static Connection conn=null;
/**
* 得到数据库连接
*
* @return Connection
*/
public Connection getconn() {
try {
// 加载驱动
Class.forName(drive);
conn = DriverManager.getConnection(url, "root", "root");
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;

}

public void test() {
this.conn=getconn();
if(conn==null){
System.out.println("数据库连接失败");
}
try {
String sql ="你的SQL语句";
int i = 1;
Statement state = conn.createStatement();//创建一个 Statement 对象来将 SQL 语句发送到数据库。
ResultSet rs = state.executeQuery(sql);//执行给定的 SQL 语句,该语句返回单个 ResultSet 对象
while (rs.next()) {
i++;
System.out.println("第" + i + "行记录");
System.out.println("你的字段:" + rs.getString(1));
System.out.println("你的字段:" + rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
MyTest test= new MyTest();
test.test();
}
}

TzSword 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tzsword 的回复:]
引用 17 楼 zsw_2009 的回复:
我在jsp页面中添加了用于获取sql: <jsp:getProperty name="base" property="conn"/>
在bean中添加了
  public String getConn()
    {  conn="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";
     
      return conn;
    }
调试时输入查询条件:张
返回的sql语句是:
SELECT * FROM employee Where name Like '%张%'
中文没有乱码为什么就是查询不到数据库中的“张三”呢?

  不要调试。。。。。。。。
    调试很晕的。。。
    将结果用输出语句打一下。。。
  Java codepublicvoid getConn()
{ List<Employee> list="SELECT * FROM employee Where"+ziduan+" Like '%"+keyWord+"%'";for(int i=0;i<list.size();i++){
System.out.println(list.getEname());
}

}
测试一下这个代码。。。
刚发现你写的有问题。。。
那个查询返回的是一个集合不是一个String
就算你的数据只有一个姓"张"的也要用集合接收..

[/Quote]
红色的地方说错了。。。。
TzSword 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 zsw_2009 的回复:]

因为在Bean中System.out.println是看不到打印结果的,我需要返回值返回到Jsp页面上啊。那集合数据类型是什么呢?还有List <Employee> Employee是什么意思啊?

[/Quote]
你在Bean里面写个main()方法测试一下我上面写的方法。。。
Java集合类型不懂???
List <Employee>泛型集合。。。。Employee是你的实体。。。
不要告诉我你没实体。。。。
zsw_2009 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tzsword 的回复:]
引用 17 楼 zsw_2009 的回复:
我在jsp页面中添加了用于获取sql: <jsp:getProperty name="base" property="conn"/>
在bean中添加了
  public String getConn()
    {  conn="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";
     
      return conn;
    }
调试时输入查询条件:张
返回的sql语句是:
SELECT * FROM employee Where name Like '%张%'
中文没有乱码为什么就是查询不到数据库中的“张三”呢?

  不要调试。。。。。。。。
    调试很晕的。。。
    将结果用输出语句打一下。。。
     Java codepublicvoid getConn()
{ List<Employee> list="SELECT * FROM employee Where"+ziduan+" Like '%"+keyWord+"%'";for(int i=0;i<list.size();i++){
System.out.println(list.getEname());
}

}
测试一下这个代码。。。
刚发现你写的有问题。。。
那个查询返回的是一个集合不是一个String。。。。
就算你的数据只有一个姓"张"的也要用集合接收..
[/Quote]

因为在Bean中System.out.println是看不到打印结果的,我需要返回值返回到Jsp页面上啊。那集合数据类型是什么呢?还有List<Employee> Employee是什么意思啊?
阿_布 2009-12-29
  • 打赏
  • 举报
回复
在mysql中执行:
show variables like 'char%';看一下你的数据库编码设置。
如果不是gb2312的话,在mysql安装目录下有个my.ini文件,找到default-character-set
把值改成default-character-set=gb2312,重启mysql。
wenjjing2lianee 2009-12-29
  • 打赏
  • 举报
回复
推荐:统一编码
up
sweatcoffee 2009-12-29
  • 打赏
  • 举报
回复
路过,学习
TzSword 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zsw_2009 的回复:]
我在jsp页面中添加了用于获取sql: <jsp:getProperty name="base" property="conn"/>
在bean中添加了
  public String getConn()
    {  conn="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";
     
      return conn;
    }
调试时输入查询条件:张
返回的sql语句是:
SELECT * FROM employee Where name Like '%张%'
中文没有乱码为什么就是查询不到数据库中的“张三”呢?
[/Quote]
不要调试。。。。。。。。
调试很晕的。。。
将结果用输出语句打一下。。。

public void getConn()
{ List<Employee> list="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";
for(int i=0;i<list.size();i++){
System.out.println(list.getEname());
}

}
测试一下这个代码。。。
刚发现你写的有问题。。。
那个查询返回的是一个集合不是一个String。。。。
就算你的数据只有一个姓"张"的也要用集合接收..
forever_ai 2009-12-29
  • 打赏
  • 举报
回复
路过
crazylaa 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zsw_2009 的回复:]
我在jsp页面中添加了用于获取sql: <jsp:getProperty name="base" property="conn"/>
在bean中添加了
  public String getConn()
    {  conn="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";

      return conn;
    }
调试时输入查询条件:张
返回的sql语句是:
SELECT * FROM employee Where name Like '%张%'
中文没有乱码为什么就是查询不到数据库中的“张三”呢?
[/Quote]

参考下我写的一篇帖子
http://topic.csdn.net/u/20091224/04/d09ec216-9cda-426d-b561-701833f51a50.html
zsw_2009 2009-12-29
  • 打赏
  • 举报
回复
我在jsp页面中添加了用于获取sql:<jsp:getProperty name="base" property="conn"/>
在bean中添加了
public String getConn()
{ conn="SELECT * FROM employee Where "+ziduan+" Like '%"+keyWord+"%'";

return conn;
}
调试时输入查询条件:张
返回的sql语句是:
SELECT * FROM employee Where name Like '%张%'
中文没有乱码为什么就是查询不到数据库中的“张三”呢?
zsw_2009 2009-12-29
  • 打赏
  • 举报
回复
新手不会啊。JavaBean程序调试就是麻烦啊。网页上看不到任何错误提示。调试起来很费劲啊。
crazylaa 2009-12-29
  • 打赏
  • 举报
回复
哎mysql不懂。
coveking 2009-12-29
  • 打赏
  • 举报
回复
打印出你的查询语句,肯定是乱码的keyword
找到问题后再去调试编码解码的格式,直到打印出正常的keyword后,数据自然来!
TzSword 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zsw_2009 的回复:]
sql语句确实是发生乱码了。我改成
<%@ page contentType="text/html;charset=utf-8" %>
byte bb[]=keyWord.getBytes("ISO-8859-1"); 
keyWord=new String(bb,"utf-8");
输出的sql语句没问题可还是无显示,怎么回事呢?
[/Quote]
是否拿到数据了?
先看看能否不乱码的拿到数据。。。
然后再搞界面。。。。
zsw_2009 2009-12-29
  • 打赏
  • 举报
回复
sql语句确实是发生乱码了。我改成
<%@ page contentType="text/html;charset=utf-8" %>
byte bb[]=keyWord.getBytes("ISO-8859-1");
keyWord=new String(bb,"utf-8");
输出的sql语句没问题可还是无显示,怎么回事呢?
flowersove 2009-12-29
  • 打赏
  • 举报
回复
这个应该是你在页面传值的时候 后台接收到数据时就乱了 所以你在数据库中检索的时候搜索不出来 你可以把你的搜索条件打印出来看看是否乱码 建议搜索的时候采用post的方式
TzSword 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zsw_2009 的回复:]
是DOS进入MySql目录输mysqld-nt --character_set_server=GB2312 吧,好像还是不行哎。
[/Quote]
你重新启动了没?
你在SQL下查一下看看。。。
用中文的。。
zsw_2009 2009-12-29
  • 打赏
  • 举报
回复
是DOS进入MySql目录输mysqld-nt --character_set_server=GB2312 吧,好像还是不行哎。
加载更多回复(8)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧