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
default-character-set=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的中文亂碼是如何解決的,那么你只要知道以上的解決思路,我想解決起來肯定會很快的。

轉自http://www.zihou.me/html/2010/06/07/2245.html

如果這一切都設置無誤,就要思考程序本身的問題了,如果頁面傳入數據庫本身的就是亂碼,那么就是程序的問題了,仔細核對,果然,問題出現在Servlet的處理上,添加以下語句問題成功解決。

req.setCharacterEncoding("utf-8");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM