(轉載)JSP+MySQL 亂碼問題的總結

文章轉載自:[url]http://www.netjsp.com/main/helpcontent.jsp?id=ff8080812b32e071012bb12f0b440d06[/url]

JSP+MySQL 亂碼問題的總結
  JSP+MySQL的亂碼問題是我站虛擬主機用戶所諮詢的頻率最高的問題,本文以UTF8編碼爲例把影響編碼的各個方面經行說明,以供用戶參考。主要注意以下幾個方面:
[*]1.服務器向客戶端發送的頁面編碼要設置爲UTF8:

<%@ page contentType="text/html; charset=UTF-8" %>


[*]2.頁面的保存格式爲UTF8:
一般編輯器默認保存的編碼都是ascii,最好選擇另存指定編碼。

[*]3.保證請求參數爲UTF8。
如果使用GET方式傳遞參數,請爲Tomcat的HTTP Connector設置URIEncoding參數爲UTF-8。
如果使用POST方式傳遞參數,請使用request.setCharacterEncoding("UTF-8")。

[*]4.MySQL數據庫編碼的編碼可以在庫、表、字段3個級別進行設置,優先級爲 庫 < 表 < 字段。如果庫的編碼爲UTF8,你在創建表格及字段時沒有明確指定其字符集,那麼表及字段的編碼就繼承庫的編碼也爲UTF8。因此如果你在表格和字段級別具體指定了字符集,那麼數據庫的字符集已經沒有意義,不會影響你的編碼。最終的編碼在字段上,只要字段的編碼格式正確,數據庫和表的編碼已經無關緊要。我站虛擬主機的數據庫默認字符集就是utf8,如果你在創建表格及其字段時沒有明確指定其編碼,字段的編碼就會是utf8了。
本站爲用戶創建的數據庫默認編碼爲utf8,如果您需要其它編碼,例如gbk,可以使用以下命令修改自己庫的默認編碼:

ALTER DATABASE 數據庫名稱 DEFAULT CHARACTER SET '字符集名稱'

示例:

ALTER DATABASE test DEFAULT CHARACTER SET 'gbk'


show variables like "%colla%"查看的是數據庫系統的默認編碼,查看自己庫的默認編碼應該使用mysql遠程登錄到數據庫:
use db;
status;
示例:
mysql> status
--------------
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (x86_64) using readline 5.1

Connection id: 10044
Current database: za00001
Current user: za00001@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.77 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 39 days 20 hours 26 sec
上面信息中的Db characterset 就是自己數據庫的編碼!
Client characterset是客戶端鏈接時使用的編碼,使用mysql命令時要附帶--default-character-set參數,否則如果你使用中文,mysql命令會顯示亂碼。
mysql命令有--default-character-set 參數改變客戶端鏈接編碼,那麼JDBC鏈接如何處理呢,請看下面的地5節。

[*]5.JDBC的url的設置。
需要設置useUnicode=true和characterEncoding=utf8這兩個參數,例如:
String jdbcUrl="jdbc:mysql://localhost:3306/fcm1?useUnicode=true&characterEncoding=utf8";
如果你在xml文件中,例如context.xml裏配置數據源,請將上面的&使用&來替換,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/FCM"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
password="passwd"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/fcm1?useUnicode=true&characterEncoding=utf8"
maxActive="4"/>
</Context>


只要保證上面5個方面沒有問題,那麼就不會出現亂碼了,Good Luck!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章