首页 > 开发 > JSP > 正文

JSP连接MySQL数据库时中文编码问题解决方法

2023-05-01 14:14:53
字体:
来源:转载
供稿:网友

当我们用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这样就可以确保我们解决中文字符的输出问题了!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表