看到一篇很好的文章,轉錄於此
中文亂碼似乎是程式編寫中永恆的乙個話題和難點,就比如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:
上面的語句中為乙個test的資料庫,使用者名為test,密碼為111的資料庫連線,其編碼為characterencoding=utf-8。
通過以上四個方面的設定,那麼mysql的中文亂碼就輕鬆解決了!
如果你過段時間不記得mysql的中文亂碼是如何解決的,那麼你只要知道以上的解決思路,我想解決起來肯定會很快的。
如果這一切都設定無誤,就要思考程式本身的問題了,如果頁面傳入資料庫本身的就是亂碼,那麼就是程式的問題了,仔細核對,果然,問題出現在servlet的處理上,新增以下語句問題成功解決。
req.setcharacterencoding("utf-8");
mysql亂碼問題
原來使用過一段時間mysql,感覺簡單方便,很好用。但是今天使用居然發生了亂碼。經過在網上搜尋,很快解決了這個問題。亂碼的最終根源就是字符集問題。主要有以下原因 1.在建立資料庫時指定字符集 create database test character set gbk 2.也可以修改data目錄中相...
mysql亂碼問題!
1 修改 my.ini mysql server instance configuration 檔案 client section 客戶端 client port 3306 mysql default character set gbk server section 服務端 mysqld defau...
mysql 亂碼問題
mysql 中英文插入時,出現亂碼無法插入的問題。由於是ubuntu的機器,mysql的配置檔案是 etc mysql my.cnf 設定了下配置檔案my.cnf的編碼為utf8 client default character set utf8 default character set utf8...