如果是奔着解决问题而来,请直接跳到 四.5 希望能对你们有所帮助

一、前言

第一段话写给自己:早在一年多前,刚刚上手mysql的时候,就对windows命令行下的mysql中文乱码现象有所见闻。心里也一直对此怀有芥蒂,毕竟之前是通过Navicat等数据库可视化工具来查看数据,相当于是对这个现象强行视而不见,草草了事。现如今当我有兴趣解决这个问题的时候,才发现这个问题的难度着实不小,耗费了一个下午的精力,才算是误打误撞解决了这个问题,特此写下这篇博客给自己和那些同样遇到该问题的同学们,帮助消化该问题,一起寻找这个解决方法的本质到底是什么。

二、背景

刚开始时,我认为以前遇到的乱码问题是由部分character的值为latin1造成的(此时在我的脑海中,这个问题的本质是在客户端方面新输入的中文由utf8编码表示,而存储时要经过latin1与utf8之间相互转换,因为两种编码之间的不兼容问题所以才会造成中文变成了乱码,后来的事实证明,这种想法是片面的、错误的),因此,我提前打了预防针,也就是将数据库的那些characters能设为utf8的都设为utf8的格式(如下图)

 

mysql命令 use database_命令提示符

各个字符集的含义如下

mysql命令 use database_命令提示符_02

三、从发现问题到提出问题:

而后,当我信心满满的重新建表测试的时候,遇到了比之前更为严重的中文无法兼容问题。

建表语句为:

create table test(
 num int(11) AUTO_INCREMENT,
 words varchar(10) not null unique,
 primary key(num)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

mysql命令 use database_客户端_03

mysql命令 use database_客户端_04

先简略描述出遇到的问题:

插入中文时,中文全部变为空白(连空格都没),并且所有中文都受到UNIQUE约束的限制!这个限制在这里的意思是什么呢,不论你输入的中文为不同的字也好不同的句子也好,统统都被认定为相同输入——"" (即图片所表示的空白字符,而这个特殊字符应该暂时没什么故事,先不做讨论) 具体如图:

mysql命令 use database_mysql_05

图1.1

mysql命令 use database_mysql_06

图1.2

 

 

图1.1中的第二次中文插入,产生了报错—error1062,该报错意思即为,对"列2"进行了相同的插入,报错原因是在UNIQUE的约束下,将两次中文输入都视为同一个空白串。

图1.2表示在navicat中,中文插入被数据库切切实实的存成了空白串。

这个错误显然是一个重大阻碍,不止影响了我们对中文字符的查看,还直接影响了我们对中文字符进行的输入输出。

四、从分析问题到解决问题

首先,我是通过以下几步操作,才最终确定问题出现的源头(应该是源头吧¬_¬)

1.在Navicat端,我将第三行的空白串字段修改为"你好",而在命令行的mysql客户端却显示为乱码,因此我得出结论编码问题一定出在mysql客户端上,而原因可能有很多,需要进一步确定

mysql命令 use database_命令提示符_07

mysql命令 use database_mysql_08

2.随后我检查了命令提示符的编码格式,发现为GBK,我仿佛闻到了一丝阴谋的味道

mysql命令 use database_mysql_09

3.我决定将命令提示符的编码改为和mysql客户端一致的编码——utf8,在cmd中输入如下指令:chcp 65001 

并将字体修改为广为推荐的Lucida Console字体,以获得更好的兼容性

mysql命令 use database_mysql_10

mysql命令 use database_命令提示符_11

 

4.打开mysql客户端,重新插入语句,结果直接退出了mysql客户端了,此刻的我已经一脸懵逼

mysql命令 use database_客户端_12

mysql命令 use database_命令提示符_13

5.不败不馁,看来将命令提示符的编码修改为utf8这条路行不通,我决定将状态退回第3步前。接着来,修改mysql客户端的编码,使其与改为和命令提示符一致的编码——GBK

(1)通过mysql指令:  set names gbk;   来修改客户端的编码格式

(2)通过指令:show variables like "%char%";   来查看修改后的客户端的编码格式

(3)对测试表进行中文字符的插入

mysql命令 use database_命令提示符_14

mysql命令 use database_客户端_15

mysql命令 use database_mysql_16

搞定!

PS:如果不想每次登陆数据库后都使用set names gbk;指令来修改编码,可以在配置文件my.ini中添加或修改为下列语句:

[client]
default-character-set=gbk

这样就能够永久保存编码的修改了。

终于写完了,谢谢自己也谢谢大家。