jdbc連線mysql中文亂碼問題
看到一篇很好的文章,轉錄於此
中文亂碼似乎是程式編寫中永恆的一個話題和難點,就比如MySQL存取中文亂碼,但我想做任何事情,都要有個思路才行,有了思路才知道如何去解決問題,否則,即使一時解決了問題,但過後不久又碰到同樣的問題可能又會急得抓狂,MySQL中文亂碼問題就是如此。
僅僅對MySQL中文亂碼的解決而言,我認為主要的一個原則可以歸結為五個字:“編碼一致性”,只要遵循了這個原則,那麼中文亂碼就不難解決,那麼何為“編碼一致性”呢?子猴總結為有如下四個方面的編碼必須保持一致,才能防止中文的亂碼,下面將具體講解。
首先我要設定的編碼為UTF8,為何要設定UTF8編碼呢?那是因為這是通用編碼,像中國通常使用的GBK、GB2312、Big5等只是針對中文而言,但是對其他文字就不適用了,為了使得這個問題的解決具有文字編碼通用性,所以我這裡設定了UTF8這個編碼。
編碼一致性涉及到的四個方面為:應用程式編碼、資料庫系統編碼、資料庫編碼、應用程式與資料庫系統的連線編碼。
1、 應用程式編碼
指的是你在程式檔案中的文字編碼,以jsp檔案為例來說明,就是你jsp的網頁編碼,比如:
<%@ page contentType="text/html; charset=UTF-8" %>
在這樣的頁面中,往往是呼叫資料庫介面對資料庫進行存取操作。
2、 與之對應的資料庫系統編碼
資料庫系統就是你所用的MySQL(及其他資料庫系統),資料庫系統的編碼要與應用程式編碼一致,其編碼設定根據作業系統的不同可以通過以下方式設定
2.1、Windosw環境下的MySQL編碼設定
A、中止MySQL服務
B、在MySQL的安裝目錄下找到my.ini,如果沒有就把my-medium.ini複製為一個my.ini即可
C、開啟my.ini以後,在[client]和[mysqld]下面均加上default-character-set=utf8,儲存並關閉
D、啟動MySQL服務
(注:Windows環境下的設定我沒有驗證過)
2.2、Linux環境下的MySQL編碼設定
首先我們登入到mysql,執行:show variables like ‘character%’;來檢視資料庫系統當前的編碼方式,一般情況下,你會看到如下所示:
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
也就是預設編碼都是latin1,很顯然,我們要修改為UTF8。
通過:vi /etc/mysql/my.cnf修改my.cnf檔案,這裡需要注意的是,如果my.cnf檔案不存在,則進入到mysql的安裝目錄,通過執行:cp share/mysql/my-large.cnf /etc/my.cnf生成my.cnf檔案。
加入的內容如下:
在客戶端配置[client]下面新增:
### 預設字符集為utf8
character-set-server=utf8
找到[mysqld]部分,在下面新增:
### 預設字符集為utf8
default-character-set=utf8
### (設定連線mysql資料庫時使用utf8編碼,以讓mysql資料庫為utf8執行)
init_connect=’SET NAMES utf8′
完畢後重啟mysql服務,然後再通過執行show variables like ‘character%’;檢視如下:
mysql> show variables like ‘character%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
3、 資料庫編碼
改完資料庫系統編碼後,接下來輪到資料庫編碼了,請注意資料庫系統與資料庫的區別,資料庫指的是你所建立的資料庫Database及所包含的表,資料庫編碼設定很簡單,在建立資料表的時候設定,舉例如下:
create table Test
(
ID integer not null auto_increment,
NAME varchar(50) comment ‘測試欄位’,
TYPE integer,
primary key (ID)
)
default charset utf8;
其中default charset utf8就表示此表的字元編碼為utf8。
4、 應用程式與資料庫系統的連線編碼
連線編碼相當於應用程式與資料庫系統的溝通橋樑,同樣也需要設定編碼,我們以JDBC的連線語句來予以說明:
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&user=test&password=111
上面的語句中為一個test的資料庫,使用者名稱為test,密碼為111的資料庫連線,其編碼為characterEncoding=UTF-8。
通過以上四個方面的設定,那麼mysql的中文亂碼就輕鬆解決了!
如果你過段時間不記得mysql的中文亂碼是如何解決的,那麼你只要知道以上的解決思路,我想解決起來肯定會很快的。
如果這一切都設定無誤,就要思考程式本身的問題了,如果頁面傳入資料庫本身的就是亂碼,那麼就是程式的問題了,仔細核對,果然,問題出現在Servlet的處理上,新增以下語句問題成功解決。
req.setCharacterEncoding("utf-8");