MySQL中UTF8编码的数据在cmd下乱码

花了一下午,解决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编码的:

MySQL中UTF8编码的数据在cmd下乱码

数据库、表都重建了,数据文件也保证是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)\MySQL\MySQL 
+--------------------------+------------------------------------
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,自然就乱码了,改用工具试试”,这才一语惊醒梦中人,于是使用工具查询数据库,结果是这样滴:

MySQL中UTF8编码的数据在cmd下乱码

这才发现其实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)\MySQL\MySQL
+--------------------------+-----------------------------------
rows in set (0.00 sec)

可以看到,client,connection和result的编码已经设置为gbk了,但server,database,filesystem的编码还是utf8!这就是说,虽然数据依然是使用utf8编码存储的,但是客户端以及返回的结果集是gbk的,而此时cmd窗口的编码正好是gbk,因此该结果集能正确显示了。

搞了半天,结果是这样。。。但这样也好,毕竟让我印象深刻了,应该不会有下次了。

完。

上一篇:检测系统中包文件是否完整的方法


下一篇:Centos6.5安装mysql不能启动,应该安装mysql-server