看到一篇很好的文章,轉錄於此
中文亂碼似乎是程序編寫中永恆的一個話題和難點,就比如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&characterEncoding=UTF-8&user=test&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");