當我們用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這樣就可以確保我們解決中文字符的輸出問題了!
新聞熱點
疑難解答