• 第3章 【MySQL】字符集和比较规则


    3.1 字符集和比较规则简介

    3.1.1 字符集简介

    如何存储字符串?需要建立字符与二进制数据的映射关系。建立这个关系需要:

    1.把哪些字符映射成二进制数据

    2.怎么映射?

    将一个字符映射成一个二进制数据的过程也叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解码 。

    人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则。比方说我们来自定义一个名称为 xiaohaizi 的字符集,它包含的字符范围和编码规则如下:

    包含字符 'a' 、 'b' 、 'A' 、 'B' 。

    编码规则如下:

    采用1个字节编码一个字符的形式,字符和字节的映射关系如下:

    'a' -> 00000001 (十六进制:0x01)

    'b' -> 00000010 (十六进制:0x02)

    'A' -> 00000011 (十六进制:0x03)

    'B' -> 00000100 (十六进制:0x04)

    有了 xiaohaizi 字符集,我们就可以用二进制形式表示一些字符串了,下边是一些字符串用 xiaohaizi 字符集编码后的二进制表示:

    'bA' -> 0000001000000011 (十六进制:0x0203)

    'baB' -> 000000100000000100000100 (十六进制:0x020104)

    'cd' -> 无法表示,字符集xiaohaizi不包含字符'c'和'd'

    3.1.2 比较规则简介

    比较规则如下:

    1.将两个大小写不同的字符全都转为大写或者小写

    2.再比较这两个字符对应的二进制数据。

    同一种字符集可以有多种比较规则。

    3.1.3 一些重要的字符集

    ASCII 字符集

    共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式:

    'L' -> 01001100(十六进制:0x4C,十进制:76)

    'M' -> 01001101(十六进制:0x4D,十进制:77)

    ISO 8859-1 字符集

    共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。

    GB2312 字符集

    收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:

    如果该字符在 ASCII 字符集中,则采用1字节编码。

    否则采用2字节编码。

    GBK 字符集

    GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 。

    utf8 字符集

    收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。

    3.2 MySQL中支持的字符集和排序规则

    3.2.1 MySQL中的utf8和utf8mb4

    在 MySQL 中 utf8 是 utf8mb3 的别名,所以之后在 MySQL 中提到 utf8 就意味着使用1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用 utf8mb4 。

    3.2.2 字符集的查看

    MySQL 支持好多种字符集,查看当前 MySQL 中支持的字符集可以用下边这个语句:

    SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

    其中 CHARACTER SET 和 CHARSET 是同义词,用任意一个都可以。我们查询一下(支持的字符集太多了,我们省略了一些):

                

    可以看到,我使用的这个 MySQL 版本一共支持 41 种字符集,其中的 Default collation 列表示这种字符集中一种默认的 比较规则 。大家注意返回结果中的最后一列 Maxlen ,它代表该种字符集表示一个字符最多需要几个字节。

    字符集名称

    Maxien

    ascii

    1

    latinl

    1

    gb2312

    2

    gbk

    2

    utf8

    3

    utf8mb4

    4

    3.2.3 比较规则的查看

    查看 MySQL 中支持的比较规则的命令如下:

    SHOW COLLATION [LIKE 匹配的模式];

    先查看一下 utf8 字符集下的比较规则:

             

    这些比较规则的命名还挺有规律的,具体规律如下:

    比较规则名称以与其关联的字符集的名称开头。如上图的查询结果的比较规则名称都是以 utf8 开头的。

    后边紧跟着该比较规则主要作用于哪种语言,比如 utf8_polish_ci 表示以波兰语的规则比较,utf8_spanish_ci 是以西班牙语的规则比较, utf8_general_ci 是一种通用的比较规则。

    名称后缀意味着该比较规则是否区分语言中的重音、大小写啥的,具体可以用的值如下:

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

    比如 utf8_general_ci 这个比较规则是以 ci 结尾的,说明不区分大小写。

    每种字符集对应若干种比较规则,每种字符集都有一种默认的比较规则, SHOW COLLATION 的返回结果中的Default 列的值为 YES 的就是该字符集的默认比较规则,比方说 utf8 字符集默认的比较规则就是utf8_general_ci 。

  • 相关阅读:
    欧拉路径与欧拉回路
    K8S学习之Service实现服务发现原理分析与实践
    根据消息信息如何快速定位程序
    由一个按键程序引发的思考(下)
    Mysql范式设计原则介绍
    python可视化分析(九)-绘制金字塔图
    Linux中的/proc文件系统详解(C/C++代码实现)
    [附源码]java毕业设计疫情居家隔离服务系统
    数据挖掘:用ID3算法或者朴素贝叶斯分析一个数据集
    搜索数据库中的一行信息
  • 原文地址:https://blog.csdn.net/qq_43714918/article/details/132711426