1、一个建表语句引出的问题
create table student( sid int primary key aotu_increment, sname varchar(20) not null, age int )charset=utf8;
思考一个问题:
对于刚刚安装好的MySQL,我们随意写了一个建表语句。当建表时指定charset=utf8的时候,此时,插入中文为什么又可以插入中文,并且不乱码呢?当我们建表时,不指定 charset=utf8的时候,此时,插入中文,为什么会报错呢?
2、查看当前电脑使用的字符集
打开电脑黑窗口(CMD),接着点击鼠标右键,然后选择属性,并查看“选项”这一栏。通过上图可以知道:CMD中输入文字使用的字符编码是GBK。
3、你发现这个问题了吗?
问题如下:
客户端client输入的字符,都是采用GBK编码的。mysql服务器存储的字符又是UTF8编码的。
那么,我们向数据库中插入数据,从数据库中查找数据,返回到界面中,要想保证字符不乱码,肯定是经过了"编码转换过程的"。我要问的是,究竟是什么东西完成了这个编码的转换过程的?
4、你不熟悉的几个命令
-- 查看数据库支持的所有的字符集(这句命令自己下去操作)。 mysql> show character set; -- 查看系统当前状态,里面可以看到部分字符集设置。 mysql> status; -- 查看系统字符集设置,包括所有的字符集设置 mysql> show variables like '%char%';
操作结果如下:
通过上图我们可以看到有一个东西,叫做"connection",中文名叫做"连接器"。"连接器"就是3中那个问题,我们想要知道的答案。也就是说:这个转换过程依赖的就是这个connection。
1)连接器connection的作用与工作流程(文字叙述)
① 连接器的作用
连接客户端与服务端,进行字符集的转换。连接器有这种自动转换的功能。
② 连接器的工作流程
Ⅰ 客户端的字符先发给连接器,连接器选择一种编码将其转换(转换之后的编码,与连接器的编码格式一致),进行临时存储。
Ⅱ 接着,连接器再次转换成服务器需要的编码,并最终存储在服务器中。
Ⅲ 然后,服务器返回的结果,再次先通过连接器,连接器将其转化为与客户端一致的字符集,就可以在客户端正常显示了。
2)图示法讲解connection的作用与工作流程
① 第一种方式
图示说明:
我们已经知道:在CMD窗口中输入的字符,采用的字符集是GBK,也就是说客户端(client)的字符集是GBK。而写入到数据库中数据采用什么格式写入,我们在建表的时候已经指明了"charset=utf8",也就是说,mysql服务器(server)的字符集是UTF8。此时,假如说连接器(connection)的字符集是UTF8,这个写入数据库的过程是怎么进行的呢,下面我们进行文字说明。
首先,在客户端输入的字符,使用的字符集是GBK。当经过连接器的时候,连接器会进行"字符集的自动转换",将原来的子符(以GBK进行编码)转换为以UTF8格式的编码字符,临时存储在连接器中。
接着,连接器发现mysql服务器使用的字符集,与自身字符集完全一致,都是UTF8。于是,直接发给mysql服务器,进行最终的存储。
“当我们从mysql服务器查数据的时候,返回过程又是怎么进行的呢?”
首先 ,mysql服务器会将结果以UTF8编码格式进行返回,通过连接器的时候,连接器发现mysql服务器的字符集,与自身字符集一致,于是顺利通过连接器。当连接器准备将结果发送给客户端的时候,发现客户端要求返回的字符集是GBK。因此,连接器会进行"字符集的自动转换",将返回的结果(以UTF8进行编码)转换为以GBK格式的编码,进行显示,并最终发送给客户端,显示在CMD窗口中。