MySql笔记-基础篇-编码解码与乱码

Posted luffysk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql笔记-基础篇-编码解码与乱码相关的知识,希望对你有一定的参考价值。

1.编码、解码与乱码的由来

编码

计算机系统的本质是一堆的0和1组成的,计算机也只认识0和1。在计算机内部,0代表开关断开,即低电压状态,1代表开关闭合,即高电压状态, 通过高低电压的变化表示01的变化。
image.png
计算机只能识别0和1,但是人却可以识别非常多的信息,那么如何使用计算机来帮助人类工作呢?
人们给计算机中的状态赋予了特定的含义,比如1和0代表两种状态,那么两位的1和0就可以代表4中状态,以此类推,假如我想表示东南西北,那么在计算机中可以使用00表示东、01表示南、10表示西,11表示北。经过这样规定以后这两位数值就有了具体的含义

汉字 二进制
00
01
西 10
11

这张表就被称为编码表,当我们需要给计算机输入东时,只要传给它00就默认代表了东
目前世界上有很多的编码表,其中以utf-8最为常用,因为它几乎包含了世界上绝大部分的字符

解码

编码是将人类语言转换为计算机语言,而解码则是将计算机语言再转化为人类语言
还是以东南西北为例,如果计算机输出了01,那么对照着码表就能得到南这个汉字,这个过程就称为解码
image.png

乱码

因为码表是人为规定的,每个人、每个组织、每个国家都可以规定自己的码表,但是想要和别人正常的交流就必须让其他人使用和你相同的码表,目前有很多码表,比如ascii、utf-8,gbk等,如果编码过程和解码过程使用不同的码表时就会出现乱码
image.png
因此只要保证编码和解码使用相同的码表就不会出现乱码的情况

2.mysql中请求的处理过程

客户端发起请求

mysql是典型的CS架构,一条sql首先由客户端发给服务端,服务端处理后将结果返回给客户端,客户端再将结果展示在屏幕上
假设使用cmd窗口作为客户端,通过chcp查看客户端的编码
image.png
其中936代表了gbk编码,因此使用cmd窗口发出的命令都是使用gbk编码之后的二进制位
使用cmd登录mysql,发送查询sql,此条sql将被gbk码表编码,然后将编码后的01字符串发送给服务端,即占用3306端口的mysqld进程
image.png

服务端接收请求

当请求发送至服务端后,服务端首先做的是通过变量character_set_client设置的值将字符串解码,然后进行后续操作
image.png
此处显示此变量值为gbk,因此用此码表解码不会出现乱码情况
image.png

再次进行编码

经过上步解码后,服务端又会将字符串使用character_set_client变量的值进行编码
image.png
由图可知此编码使用的依旧为gbk码表
image.png
将编码后的数据传给下一步进行处理

返回结果

将请求发给下一步后,会根据查询的表或字段设置的编码将请求解码,然后查询数据,最后将结果数据通过character_set_result进行编码
image.png
由图可知返回的数据经过了gbk码表编码
image.png

客户端展示

服务端将结果数据返回给客户端,客户端再次使用它的编码将返回的数据解码,由前图可知cmd客户端使用的是gbk码表
image.png
至此整个查询过程就结束了,中间经过了多次的编解码操作,为了保证查询的数据不产生乱码,只需要将此过程中涉及的多个变量都设置为统一的编码即可

3.总结图

image.png

以上是关于MySql笔记-基础篇-编码解码与乱码的主要内容,如果未能解决你的问题,请参考以下文章

第125篇 笔记-solidity中的编码与解码

字符编码与解码

1.JAVA WEB 笔记中文乱码

GET请求中关于中文的编码与解码

视频编解码·学习笔记7. 熵编码算法:基础知识 & 哈夫曼编码

java中文乱码解决之道—–javaWeb中的编码解码