天天看點

MySQL中文亂碼解決方法(原創)

本人之前下載下傳了一款用于可視化操作MySQL資料的軟體 Navicat 8 for MySQL,挺好用的,順便也可用于測試一下中文亂碼問題是否解決

分步驟進行

一、設定字元集為UTF8

首先,如果要在資料庫中存儲中文資料,個人建議将資料庫的字元集設定為utf8

當你調用CREATE DATABASE onedbname;時,MySQL會根據預設字元集來設定建立的資料庫的字元集,是以為友善起見應該在建立資料庫之前設定資料庫的預設字元集

找到MySQL安裝的目錄(如E:\Program Files\MySQL\MySQL Server 5.1\),找到my.ini檔案,進行如下修改(方法在網上搜的,測試成功):

    1、[mysql]下的

    default-character-set=latin1

    改為

    default-character-set=utf8

    2、[mysqld]下的

這樣,就将MySQL資料庫的預設字元集設定為utf8了

重新啟動MySQL資料庫,這個指令行指令不了解,我使用的方法如下:

控制台->管理工具->服務,找到MySQL服務(若未找到,可以通過mysqld --install指令安裝服務),結束掉,然後重新開啟。

你可以用Navicat的可視化界面建立資料庫,建立表,插入資料,你可以看到文本資料使用的是utf8編碼,檢視16進制資料,可以看到每個漢字占用3個位元組(不知是否中文都如此)。

你也可以用mysql指令行建立資料庫,建立表。當你執行一條插入指令帶有中文時應該會出錯!!!往下看!

二、指令行中插入與擷取UTF8格式資料

進行了第一步的設定後,你執行如下指令

INSERT INTO tableName(id, lable) VALUES(100, '巨蟻很牛叉');

出錯!你需要先執行下面一個指令

SET NAMES GBK;

之後重新執行一遍上面的語句,成功!

根據我的思考,此處緣由應該是這樣:

    MySQL不希望字元集問題給使用者造成諸多不便,增加了一個将指令行的字元串轉換為資料庫所需字元集的字元串,比如我們一般在控制台輸入的中文,一個字元都占用2個位元組,通過SET NAMES GBK來說明我們的輸入中含有中文需要進行相應轉換。

    根據我剛剛對GBK編碼的測試,我發現竟然和之前設定成UTF8的文本資料完全一樣,在網上搜的GBK中文占用2位元組,感覺甚是奇怪,究竟什麼原因以後深入研究下應該可以明确。

上面的問題當你在執行SELECT語句時情況一樣。

總之,當你要在指令行中處理有UTF8字元集的資料時,先調用一局SET NAMES GBK 就行了!

三、程式中處理插入與擷取資料庫中字元串資料

有一天夜裡為在我的使用UNICODE的C++ WIN32控制台程式中顯示中文,傷透了腦筋,之後第二天中午解決了,解決辦法是我直接擷取了UTF8字元資料,然後調用 MultiByteToWideChar(CP_UTF8, ...)轉換為UNICODE字元串即可用_cwprintf進行顯示。

如果要Insert中文資料的話,就不能直接傳遞字元串了,需要先将UNICODE字元串轉換為UTF8格式的連續位元組,然後發送指令的話傳遞一段連續的位元組,應該有些麻煩。

現在可以采用第二步的方法,執行SQL指令 SET NAMES GBK,萬事大吉,具體就不細說了,進行測試無誤,不過對于UNICODE程式還是要進行相應的轉換。

寫了這麼多,時間不早了,希望能給初使用MySQL的同行一些幫助...