从零开始学Mysql - 字符集和编码(上)(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 从零开始学Mysql - 字符集和编码(上)(一)

前言


上一节我们系统的阐述了关于系统配置的相关细节内容,而这一节我们需要了解关于字符集和编码的内容,字符集和编码的规则其实也算是入门mysql经常遇到的一个坑,基本每个人学习过程必定会遇到数据库存储中文但是读出来是:“???”的这种问题,好了废话不多说,我们来看下mysql的字符集和编码的规则。


编码



简单介绍


关于编码和解码,简单来讲编码就是把字符转变为二进制数据,解码就是把二进制的数据按照一定的规则翻译成字符,关于编解码的定义只需要了解两个重点:

  1. 字符是如何映射成为二进制数据的
  2. 那些字符需要映射二进制的数据

比如我们把abcd拆分成四种自定义的编码格式,使用十六进制表示,a占一位,b占两位,c占3位,d占四位,我们可以使用含有abcd的字符进行不同的组合编码,但是不能对于ef,或者zh等等字符进行编码,因为我们设计的规则不认识这些字符,编码之后的数据按照自己设计的编码解码翻译回原来的数据,这就是最简单的编码和解码规则。


如何比较大小


我们知道了如何对于字符进行编码,那么我们如何对于字符进行比较呢?我们最可能想到的规则是按照26个字母的顺序进行比较排序大小,其实二进制的比较规则是非常简单的,但是我们会发现有时候会出现特殊的情况,比如英文有大小写之分,而中文又有同音字的等等,这时候就不能简单二进制比较了,我们需要做如下的调整:

  • 将字符统一转为大写或者小写再进行二进制的比较
  • 或者大小写进行不同大小的编码规则编码

所以其实我们可以发现一个字符可能会存在多个比较方式,最终意味着字符集会出现多种的比较规则形式。


字符集介绍



常见字符集


经过上面的编码介绍之后,下面我们来介绍关于字符集的内容,全世界的字符集怎么也得又个成百上千种,这还不包含各种自创的字符集,但是实际上主流的也就那么几种,比如:GBK2312,UTF-8,UTF-16等等,所以这里只简单列举几个常见的字符集:

  • ASCII 字符集:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符,一共也就128个字符,所以可以直接用一个字节表示,比如下面的内容:
  • 'L' -> 01001100(十六进制:0x4C,十进制:76)
  • 'M' -> 01001101(十六进制:0x4D,十进制:77)
  • ISO 8859-1 字符集:欧洲的通用编码,一共是256个字符,主要是在ASCII 字符集字符集的基础上扩展了128个字符,这个字符集也被称为:latin1(拉丁1,有点好奇为什么叫这个名)
  • GB2312:这个编码其实误导性挺强的,因为基本都知道这是给国人用的,可能会认为只有汉字的编码,其实它收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母等多个语言。其中收录汉字6763个, 其他文字符号682个,同时这种字符集又兼容 ASCII 字符集,所以编码方式比较特殊:
  • ASCII 字符集:按照ASCII 字符集的规则使用一个字节
  • 其他的GB2312支持的字符集:使用两个字节进行编码(汉字实在是多,这种编码收录的也是覆盖了最为常用和经常出现的)
  • 如果出现ASCII和其他字符集混用,字符需要的字节数可能不同的编码方式称为 变长编码方式,比如'啊A'的中文字符需要两个字节编码,但是A需要一个字节的编码,最后再把 **“两个字符”**进行二进制编码的拼凑。

这些数字不是敏感词,不需要记住数量,只要注意gb2312并不只是只有中文。

补充:这里可能有小伙伴好奇GB2312是怎么认识不同的字符集的,其实很简单,ASCII只有128个,所以只要是在这个范围的,基本可以断定就是ASCII的字符集,所以使用一个字符即可,如果不在这个范围,直接使用两个字节翻译即可。

  • GBK 字符集:对于GB2312进行字符集的扩展,其他无变化
  • UTF8 字符集:用苹果的广告词来说就是强者的强的一个字符集,包含了地球上的所有字符,而且因为不同字符集编码的字节数不同,所以UTF-8规定按照1-4个字节的变长编码方式进行编码,最后UTF8和gbk一样也兼容了ASCII的字符集。

补充:既然提到了UTF-8,那么这里就来说一下Unicode编码的事情,其实准确来说utf8只是Unicode字符集的其中一种编码方案,Unicode字符集可以采用utf8、utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个 字符,utf32使用4个字节编码一个字符。

另外,Mysql早期的utf8并不是真正意义上的utf8这个后续会进行补充

最后我们可以发现,对于同一个字符在不同的字符集会有不同的编码方式,对于一个汉字来说,ASCII字符集没有收录,下面我们比较utf-8和gbk是如何收录的,比如一个字符的'我'汉字假设是如下的编码方式:

  • utf8编码:111001101000100010010001 (3个字节,十六进制表示是:0xE68891)
  • gb2312编码:1100111011010010 (2个字节,十六进制表示是:0xCED2)


如何查看字符集


查看字符集的命令十分简单:show (character set|charset) [like 匹配模式],括号内表示可以任选其中一个,比如选择character set,当然比较难打,所以charset更常用一些,记住这一个即可。

下面是具体的案例,可以看到目前mysql支持41种字符集:


> show charset;
armscii8  ARMSCII-8 Armenian  armscii8_general_ci 1
ascii US ASCII  ascii_general_ci  1
big5  Big5 Traditional Chinese  big5_chinese_ci 2
binary  Binary pseudo charset binary  1
cp1250  Windows Central European  cp1250_general_ci 1
cp1251  Windows Cyrillic  cp1251_general_ci 1
cp1256  Windows Arabic  cp1256_general_ci 1
cp1257  Windows Baltic  cp1257_general_ci 1
cp850 DOS West European cp850_general_ci  1
cp852 DOS Central European  cp852_general_ci  1
cp866 DOS Russian cp866_general_ci  1
> show charset like 'big%';
big5  Big5 Traditional Chinese  big5_chinese_ci 2


下面是需要记忆的几个字符集,也是最常用的字符集:


网络异常,图片无法展示
|


比较规则查看



之前介绍过字符集是有比较规则,mysql吧比较多规则设置为一个命令,查看mysql的比较规则如下:

show collation [like 匹配模式]

下面是比较规则的相关案例,可以看到光是utf开头的比较规则就有150多种:


mysql> show collation like 'utf_%';


网络异常,图片无法展示
|


比较规则的规律


  • 比较规则和前缀进行匹配,比如utf_8的字符集都是按照utf8开头的。
  • 前缀为字符集的匹配,那么后缀就是和语言有关了,比如utf8_polish_ci按照波兰语匹配,utf8_spanish_ci 是以西班牙语的规则比较,通用匹配规则为: utf8_general_ci
  • 名称后缀意味着该比较规则是否区分语言中的重音、大小写啥,比如ci代表的是不区分大小写。


|后缀|英文释义|描述| |:--:|:--:|:--:| | _ai | accent insensitive |不区分重音| | _as | accent sensitive |区分重 音| | _ci | case insensitive |不区分大小写| | _cs | case sensitive |区分大小写| | _bin | binary |以二进制 方式比较|


每种字符集对应若干种比较规则,每种字符集都有一种默认的比较规则,我们可以看到上面的截图中有一个Default的列就是当前字符集的默认比较规则。比方说 utf8 字符集默认的比较规则就是utf8_general_ci


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
167 0
【MySQL】——数据类型及字符集
|
5月前
|
存储 关系型数据库 MySQL
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』
52 0
|
2月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
2月前
|
存储 人工智能 关系型数据库
详细介绍TiDB 与 MySQL 中的常用字符集及排序规则
一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
142 6
|
3月前
|
存储 关系型数据库 MySQL
【2024】新建mysql数据库,如何选择字符集和排序规则
【2024】新建mysql数据库,如何选择字符集和排序规则
159 1
|
3月前
|
存储 关系型数据库 MySQL
从零开始学Mysql - 字符集和编码(下)
从零开始学Mysql - 字符集和编码(下)
109 0
|
3月前
|
存储 SQL 关系型数据库
从零开始学Mysql - 字符集和编码(上)
从零开始学Mysql - 字符集和编码(上)
140 0
|
5月前
|
关系型数据库 MySQL 数据库
Mysql 创建数据库字符集与排序规则
Mysql 创建数据库字符集与排序规则
159 2
|
5月前
|
关系型数据库 MySQL Linux
Linux下修改MySQL字符集等配置
Linux下修改MySQL字符集等配置
137 0
|
5月前
|
关系型数据库 MySQL Linux
【Linux 下 MySQL5.7 中文编码设置】
【Linux 下 MySQL5.7 中文编码设置】