JSP连接MySQL数据库时中文编码问题

来源:互联网 发布:阿克毛事件知乎 编辑:程序博客网 时间:2024/05/26 22:10

当我们用JDBC或者数据源,从数据库中提取数据的时候,往往会遇到这样的困难:我们使用的数据库编码可能与我们网页使用的编码不一致,这就导致我们从数据库中提取的数据在网页中显示出来的是乱码。
我的运行环境仍然是eclipse3.2_Callisto+jdk1.5.0_03+Tomcat v5.5
数据库选用的是MySQL 4.1
出现这种现象的原因是:
我使用的MySQL的JDBC的驱动程序是mysqldrover.jar,这种驱动程序默认的情况下采用的是ISO-8859-1编码。
google一下,得知ISO/IEC 8859-1,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入192个字母及符号,藉以供使用变音符号的拉丁字母语言使用。显然这种编码不适合中国字。
所以我们可以采用这种方法得到中文。
举个例子:
我们可以先用MySQL创建一个数据库:

--------------------------------------------------------------------------------------
use mysql;
create database BookDB;
use BookDB;
CREATE TABLE books
(id VARCHAR(8)
 PRIMARY KEY,
name VARCHAR(24),
title VARCHAR(96),
price FLOAT,
yr INT,
description VARCHAR(30),
saleAmount INT);

INSERT INTO books VALUES('201', '王芳',
 'Java编程指南',
 33.75, 1999, '让读者轻轻松松掌握Java语言', 1000);

INSERT INTO books VALUES('202', '张丙',
 'Weblogic技术参考', 45.99,
 2002, '真的不错耶', 2000);

INSERT INTO books VALUES('203', '孙艳',
 'Oracle数据库教程',
 40, 2003, '关于Oracle的最畅销的技术书', 2000);

INSERT INTO books VALUES('204', '大卫',
 '从Oak到Java: 语言的革命',
 20.75, 1998, '很值得一看', 2000);

INSERT INTO books VALUES('205', '阿明',
 'Apache从入门到精通',
 50.75, 2002, '权威的Apache技术资料', 2000);

INSERT INTO books VALUES('206', '洪军',
 'Java与数据算法 ',
 54.75, 2002, '权威的Java技术资料', 2000);

 ---------------------------------------------------------------------------------------

接着我们就可以做一个简单的JSP文件来查询我们的BookDB了
取名为Dbjsp.jsp

----------------------------------------------------------------------------------------

<!--首先导入一些必要的packages-->
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<!--告诉编译器使用SQL包-->
<%@ page import="java.sql.*"%>
<!--设置中文输出-->
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
  <title>DbJsp.jsp</title>
</head>
<body>
<%
//以try开始
try
{
Connection con;
Statement stmt;
ResultSet rs;
//加载驱动程序,下面的代码为加载MySQL驱动程序
Class.forName("com.mysql.jdbc.Driver");
//注册MySQL驱动程序
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//用适当的驱动程序连接到数据库
String dbUrl =  "jdbc:mysql://localhost:3306/BookDB?useUnicode=true&characterEncoding=GB2312";

String dbUser="root";
String dbPwd="1234";
//建立数据库连接
con = java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);
//创建一个JDBC声明
stmt = con.createStatement();
//增加新记录
stmt.executeUpdate("INSERT INTO books (id,name,title,price) VALUES ('999','Tom','Tomcat Bible',44.5)");
//查询记录
rs = stmt.executeQuery("SELECT id,name,title,price from books");
//输出查询结果
out.println("<table border=1 width=400>");
while (rs.next())
{
String col1 = rs.getString(1);
String col2 = rs.getString(2);
String col3 = rs.getString(3);
float col4 = rs.getFloat(4);

//convert character encoding
col1=new String(col1.getBytes("ISO-8859-1"),"GB2312");
col2=new String(col2.getBytes("ISO-8859-1"),"GB2312");
col3=new String(col3.getBytes("ISO-8859-1"),"GB2312");

//打印所显示的数据
out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td><td>"+col4+"</td></tr>");
}
out.println("</table>");

//删除新增加的记录
stmt.executeUpdate("DELETE FROM books WHERE id='999'");

//关闭数据库连结
rs.close();
stmt.close();
con.close();
}

//捕获错误信息
catch (Exception e) {out.println(e.getMessage());}
%>
</body>
</html>

//对了,关键的地方就在于红色的代码部分。第一个红色部分用来在连接

//数据库的URL时就指定好字符编码

//为了保险起见,我们在往网页上输出时,即第二部分红色代码部分。

//这个主要是当我们知道JDBC使用的字符编码时,我们可以把数据库中的字符提取出来的

//时候强制转换为我们想要的比如GB2312

--------------------------------------------------------------------------------------------------------------------------

OK这样就可以确保我们解决中文字符的输出问题了!