mysql编码问题——charset=utf8你真的弄明白了吗?(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql编码问题——charset=utf8你真的弄明白了吗?(一)

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、查看当前电脑使用的字符集

image.png

 打开电脑黑窗口(CMD),接着点击鼠标右键,然后选择属性,并查看“选项”这一栏。通过上图可以知道:CMD中输入文字使用的字符编码是GBK。


3、你发现这个问题了吗?

image.png

问题如下:

 客户端client输入的字符,都是采用GBK编码的。mysql服务器存储的字符又是UTF8编码的。

 那么,我们向数据库中插入数据,从数据库中查找数据,返回到界面中,要想保证字符不乱码,肯定是经过了"编码转换过程的"。我要问的是,究竟是什么东西完成了这个编码的转换过程的?

 


4、你不熟悉的几个命令

-- 查看数据库支持的所有的字符集(这句命令自己下去操作)。
mysql> show character set;
-- 查看系统当前状态,里面可以看到部分字符集设置。
mysql> status;
-- 查看系统字符集设置,包括所有的字符集设置
mysql> show variables like '%char%';


操作结果如下:

image.png

 通过上图我们可以看到有一个东西,叫做"connection",中文名叫做"连接器"。"连接器"就是3中那个问题,我们想要知道的答案。也就是说:这个转换过程依赖的就是这个connection。


1)连接器connection的作用与工作流程(文字叙述)

① 连接器的作用

连接客户端与服务端,进行字符集的转换。连接器有这种自动转换的功能。


② 连接器的工作流程

Ⅰ 客户端的字符先发给连接器,连接器选择一种编码将其转换(转换之后的编码,与连接器的编码格式一致),进行临时存储。

Ⅱ 接着,连接器再次转换成服务器需要的编码,并最终存储在服务器中。

Ⅲ 然后,服务器返回的结果,再次先通过连接器,连接器将其转化为与客户端一致的字符集,就可以在客户端正常显示了。


2)图示法讲解connection的作用与工作流程

① 第一种方式

image.png

图示说明:

 我们已经知道:在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窗口中。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 关系型数据库 MySQL
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
88 0
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
|
7月前
|
存储 关系型数据库 MySQL
Mysql中utf8和utf8mb4区别
Mysql中utf8和utf8mb4区别
105 0
|
1月前
|
SQL 关系型数据库 MySQL
|
6月前
|
存储 自然语言处理 关系型数据库
|
6月前
|
存储 自然语言处理 搜索推荐
mysql中utf8、utf8mb4和utf8mb4_unicode_ci、utf8mb4_general_ci
mysql中utf8、utf8mb4和utf8mb4_unicode_ci、utf8mb4_general_ci
199 0
|
7月前
|
存储 关系型数据库 MySQL
从零开始学Mysql - 字符集和编码(下)
从零开始学Mysql - 字符集和编码(下)
143 0
|
7月前
|
存储 SQL 关系型数据库
从零开始学Mysql - 字符集和编码(上)
从零开始学Mysql - 字符集和编码(上)
169 0
|
7月前
|
存储 关系型数据库 MySQL
为什么不建议在MySQL中使用 utf8?
MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。 如果使用 utf8 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。
|
7月前
|
关系型数据库 MySQL Linux
【Linux 下 MySQL5.7 中文编码设置】
【Linux 下 MySQL5.7 中文编码设置】