1. 程式人生 > >jdbc連線mysql中文亂碼問題

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&amp;characterEncoding=UTF-8&amp;user=test&amp;password=111

上面的語句中為一個test的資料庫,使用者名稱為test,密碼為111的資料庫連線,其編碼為characterEncoding=UTF-8。

通過以上四個方面的設定,那麼mysql的中文亂碼就輕鬆解決了!

如果你過段時間不記得mysql的中文亂碼是如何解決的,那麼你只要知道以上的解決思路,我想解決起來肯定會很快的。

如果這一切都設定無誤,就要思考程式本身的問題了,如果頁面傳入資料庫本身的就是亂碼,那麼就是程式的問題了,仔細核對,果然,問題出現在Servlet的處理上,新增以下語句問題成功解決。

req.setCharacterEncoding("utf-8");