MySQL中UTF8編碼的資料在cmd下亂碼

小龍貓發表於2016-05-09

花了一下午,解決MySQL在Windows的cmd下中文亂碼的問題。

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> use abc;
Database changed
mysql> select from school;
+----------+--------------------+-------------------------------------------+
| schoolid | name               | address                                   |
+----------+--------------------+-------------------------------------------+
|        1 | 鍖椾含澶у          | 鍖椾含甯備腑鍏蟲溈鍖楀ぇ琛?7鍙?
|        2 | 娓呭崕澶у          | 鍖椾含甯傛搗娣€鍖轟腑鍏蟲溈澶ц
|        3 | 鍗椾含澶у          | 奼熻嫃鐪佸崡浜競榧撴ゼ鍖烘眽鍙h礬22鍙?
|        4 | 涓浗浜烘皯澶у     | 鍖椾含甯傛搗娣€鍖轟腑鍏蟲溈澶ц59鍙?
|        5 | 鍘﹂棬澶у          | 紱忓緩鐪佸帵闂ㄥ競鎬濇槑鍗楄礬422鍙?
+----------+--------------------+-------------------------------------------+
rows in set (0.00 sec)

資料是通過SQL檔案匯入的,這個SQL檔案也是UTF8編碼的:

101247_PvTF_1434710.png

資料庫、表都重建了,資料檔案也保證是UTF8了,但cmd視窗中還是亂碼。。。傷心。。。

首先,安裝MySQL的時候,我很清楚的記得我設定的編碼為UTF8,所以在my.ini檔案中:

1
2
3
4
5
6
7
# ...
[mysql]
default-character-set=utf8
# ...
[mysqld]
# ...
character-set-server=utf8

然後再mysql中驗證:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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       | C:Program Files (x86)MySQLMySQL 
+--------------------------+------------------------------------
rows in set (0.00 sec)

全部都是utf8編碼。接下來驗證資料庫的預設編碼:

1
2
3
4
5
6
7
mysql> show create database abc;
+----------+--------------------------------------------------------------+
Database Create Database                                              |
+----------+--------------------------------------------------------------+
| abc      | CREATE DATABASE `abc` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

可以看到,資料庫的預設編碼是utf8。再來驗證資料表的預設編碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show create table school;
+--------+--------------------------------------------+
Table  Create Table                               |
+--------+--------------------------------------------+
| school | CREATE TABLE `school` (
  `schoolid` int(11) NOT NULL AUTO_INCREMENT,
  `namevarchar(45) NOT NULL,
  `address` varchar(200) NOT NULL,
  `phone` varchar(11) NOT NULL,
  `master` varchar(10) NOT NULL,
  PRIMARY KEY (`schoolid`),
  UNIQUE KEY `master_UNIQUE` (`phone`),
  UNIQUE KEY `address_UNIQUE` (`address`),
  UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |
+--------+--------------------------------------------+

可以看到,表的編碼依然為utf8,那麼為什麼還是會亂碼呢??百度谷歌都找遍了,還是亂碼,然並卵。鬱悶半天,無意中在一個網頁上看到有人說“這是因為Windows的cmd預設編碼是GBK,MySQL裡面為UTF8,自然就亂碼了,改用工具試試”,這才一語驚醒夢中人,於是使用工具查詢資料庫,結果是這樣滴:

100537_bPOL_1434710.png

這才發現其實MySQL早就按照我設定的UTF編碼儲存資料了。我暈,竟然被cmd的外表矇騙了。。。。。。那麼,有沒有辦法設定讓cmd也正確顯示UTF8的編碼呢??又去百度了。。。結果是:還真有!

在cmd中登入mysql後,在輸入sql語句前,先設定編碼:set names gbk; 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select from school;
+----------+--------------+------------------------------+-
| schoolid | name         | address                      |
+----------+--------------+------------------------------+-
|        1 | 北京大學            | 北京市中關村北大街47號
|        2 | 清華大學          | 北京市海淀區中關村大街
|        3 | 南京大學           | 江蘇省南京市鼓樓區漢口路2
|        4 | 中國人民大學           | 北京市海淀區中關村大街
|        5 | 廈門大學           | 福建省廈門市思明南路422號
+----------+--------------+------------------------------+-
rows in set (0.00 sec)

那麼,為什麼這樣設定後,就能正確顯示以UTF8儲存的資料了呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables like `%character%`;
+--------------------------+-----------------------------------
| Variable_name            | Value
+--------------------------+-----------------------------------
| character_set_client     | gbk
| character_set_connection | gbk
| character_set_database   | utf8
| character_set_filesystem | binary
| character_set_results    | gbk
| character_set_server     | utf8
| character_set_system     | utf8
| character_sets_dir       | C:Program Files (x86)MySQLMySQL
+--------------------------+-----------------------------------
rows in set (0.00 sec)

可以看到,client,connection和result的編碼已經設定為gbk了,但server,database,filesystem的編碼還是utf8!這就是說,雖然資料依然是使用utf8編碼儲存的,但是客戶端以及返回的結果集是gbk的,而此時cmd視窗的編碼正好是gbk,因此該結果集能正確顯示了。

搞了半天,結果是這樣。。。但這樣也好,畢竟讓我印象深刻了,應該不會有下次了。

完。


相關文章