花了一下午,解決MySQL在Windows的cmd下中文亂碼的問題。
java
mysql> use abc; Database changed mysql> select * from school; +----------+--------------------+-------------------------------------------+ | schoolid | name | address | +----------+--------------------+-------------------------------------------+ | 1 | 鍖椾含澶у | 鍖椾含甯備腑鍏蟲潙鍖楀ぇ琛?7鍙? | 2 | 娓呭崕澶у | 鍖椾含甯傛搗娣€鍖轟腑鍏蟲潙澶ц | 3 | 鍗椾含澶у | 奼熻嫃鐪佸崡浜競榧撴ゼ鍖烘眽鍙h礬22鍙? | 4 | 涓浗浜烘皯澶у | 鍖椾含甯傛搗娣€鍖轟腑鍏蟲潙澶ц59鍙? | 5 | 鍘﹂棬澶у | 紱忓緩鐪佸帵闂ㄥ競鎬濇槑鍗楄礬422鍙? +----------+--------------------+-------------------------------------------+ 5 rows in set (0.00 sec)
數據是經過SQL文件導入的,這個SQL文件也是UTF8編碼的:
mysql
數據庫、表都重建了,數據文件也保證是UTF8了,但cmd窗口中仍是亂碼。。。傷心。。。sql
首先,安裝MySQL的時候,我很清楚的記得我設置的編碼爲UTF8,因此在my.ini文件中:
數據庫
# ... [mysql] default-character-set=utf8 # ... [mysqld] # ... character-set-server=utf8
而後再mysql中驗證:工具
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)\MySQL\MySQL +--------------------------+------------------------------------ 8 rows in set (0.00 sec)
所有都是utf8編碼。接下來驗證數據庫的默認編碼:
編碼
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。再來驗證數據表的默認編碼:spa
mysql> show create table school; +--------+--------------------------------------------+ | Table | Create Table | +--------+--------------------------------------------+ | school | CREATE TABLE `school` ( `schoolid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(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,天然就亂碼了,改用工具試試」,這才一語驚醒夢中人,因而使用工具查詢數據庫,結果是這樣滴:code
這才發現其實MySQL早就按照我設置的UTF編碼存儲數據了。我暈,居然被cmd的外表矇騙了。。。。。。那麼,有沒有辦法設置讓cmd也正確顯示UTF8的編碼呢??又去百度了。。。結果是:還真有!server
在cmd中登陸mysql後,在輸入sql語句前,先設置編碼:set names gbk; cmd
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號 +----------+--------------+------------------------------+- 5 rows in set (0.00 sec)
那麼,爲何這樣設置後,就能正確顯示以UTF8存儲的數據了呢?
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)\MySQL\MySQL +--------------------------+----------------------------------- 8 rows in set (0.00 sec)
能夠看到,client,connection和result的編碼已經設置爲gbk了,但server,database,filesystem的編碼仍是utf8!這就是說,雖然數據依然是使用utf8編碼存儲的,可是客戶端以及返回的結果集是gbk的,而此時cmd窗口的編碼正好是gbk,所以該結果集能正確顯示了。
搞了半天,結果是這樣。。。但這樣也好,畢竟讓我印象深入了,應該不會有下次了。
完。