用JAVA/JSP做開發(fā)很久了,也見過許多朋友做過,有很大一部分用的是MYSQL的數(shù)據(jù)庫,現(xiàn)在MYSQL數(shù)據(jù)庫版本5.0及以上的都已經(jīng)被用的很廣泛了,但一直有一個問題,使剛?cè)腴T的朋友費(fèi)勁心思.就是JSP連接MYSQL5數(shù)據(jù)庫的時候的一些中文問題.于是網(wǎng)絡(luò)上也出現(xiàn)了很多相關(guān)的帖子.由些大家對MYSQL5數(shù)據(jù)庫的配制文件MY.INI也有了些了解.甚至一些朋友就直接問:你們的MYSQL是什么編碼的?你們的TOMCAT是什么樣的編碼,可能不是很規(guī)范的問法,但說明了編碼問題的確影響了大家的使用.
下面的講解是在MYSQL5.0.18,TOMCAT5.0.28,驅(qū)動為mysql-connector-java-3.2.0-alpha-bin.jar及以上版本的情況下測試的
JSP連接數(shù)據(jù)庫的亂碼問題,分兩部分來看
1 數(shù)據(jù)庫中是不是亂碼?
我們需要保證數(shù)據(jù)庫保存的不是"?????"形式的亂碼,如何保證呢?
我們在管理MYSQL數(shù)據(jù)庫的時候,需要用一個客戶端,無論你用MYSQL-FRONT,EMS SQL Manager for MySQL,還是MYSQL命令行,這些都是客戶端,也是程序連接了數(shù)據(jù)庫,我們現(xiàn)在用客戶端EMS SQL Manager for MySQL連接數(shù)據(jù)庫,連接的時候一定要設(shè)置客戶端字符集為GBK或者GB2312,這樣你才能知道數(shù)據(jù)庫里面是不是亂碼.這一編碼設(shè)置很重要,不然,就算數(shù)據(jù)庫里是中文,你看到的還是亂碼

這樣連接后,我們看下我們做測試的表格,里面的漢字就是正常的,這個時候也可以直接在上面的記錄中進(jìn)入中文的修改

若這里沒有選擇編碼的話,一般默認(rèn)的就是UTF8的了,連接后再看這個表格,就會出現(xiàn)亂碼

而這個時候就會出現(xiàn)不能插入中文的問題,若您插入中文的話,就會出現(xiàn)下列錯誤

這個時候大家什么不要誤解,不是不能插入中文,也不是你插入的字符太長,
更改下連接編碼就OK了.下面是這個表格的SQL語句
CREATE TABLE `test` (
`name` varchar(100) default NULL,
`adesc` varchar(100) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
二.程序連接數(shù)據(jù)時,也要設(shè)置好連接時候的編碼,JSP連接MYSQL數(shù)據(jù)庫時候,有個URL參數(shù),jdbc:mysql://localhost:3307/sssdb?user=demoUser&password=demoPwd&useUnicode=true&characterEncoding=UTF-8,在這里需要設(shè)置成UTF-8,
下面是連接數(shù)據(jù)庫的程序代碼
<%@ page contentType="text/html;charset=GB2312" language="java"%>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<%
out.println("您的數(shù)據(jù)庫某表格中的內(nèi)容如下<br>");
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url ="jdbc:mysql://localhost:3307/sssdb?user=demoUser&password=demoPwd&useUnicode=true&characterEncoding=UTF-8";
//testDB為你的數(shù)據(jù)庫名
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {
out.println("第一個字段內(nèi)容:<font color=red>"+rs.getString(1)+"</font> 第二個字段內(nèi)容:<font color=red>"+rs.getString(2)+"</font><br>");
}
out.print("數(shù)據(jù)庫操作成功,恭喜你");
sql = "insert into test (name,adesc) values ('中文','漢字')";
stmt.execute(sql);
rs.close();
stmt.close();
conn.close();
}
catch(Exception e){
System.out.println("數(shù)據(jù)庫連接不成功"+e.toString());
}
%>
上面的經(jīng)驗是經(jīng)過多次嘗試總結(jié)出來的,不管是MYSQL的客戶端還是程序連接MYSQL數(shù)據(jù)庫,在本質(zhì)上都是程序連接數(shù)據(jù)庫,可以自己在本地多試驗下,有時候有可能是驅(qū)動太舊