5分钟带你学会选择正确MySQL字符集、排序规则

478 阅读5分钟

背景

我们知道在计算机中是采用二进制数据来存储的;我们可以通过不同的编码规则把字符编码成二进制数据,反之也可以使用这些二进制来解码成各种字符。本篇文章要介绍的就是mysql中的常用字符集。

字符集

字符集是什么

为了方便大家理解,这里举一个例子:目前我有一个只有abcd三个字符的字符集,我把它命名为abcd字符集,这四个字符采用固定长度2bit来表达,具体映射如下:

  • 00: a
  • 01: b
  • 10: c
  • 11: d

此时我想保存ac字符串,二进制就可以表达为0010,但如果想保存ef这种字符集中不存在的字符就无能为力了。这是我自定的字符集,大家也可以自定各种字符集,可以是固定2bit长度也可以固定3byte长度又或者采用变长,只要能根据规则来解码、编码这个字符集就可以。实现一个适合的字符集既可以帮助我们节省存储空间也可以加快编解码的速度。

常见的字符集

我们听说过很多字符集,但大部分都没有深入的了解过它内部真实包含了什么内容以及是如何衍生的以下介绍一些常见的字符集。

ASCII 字符集

ASCII是一种基于拉丁字母的字符编码标准,它使用7位二进制数来表示128个不同的字符,包含:

  • 大写和小写英文字母(A-Z 和 a-z)。
  • 数字 0-9。
  • 标点符号、特殊字符和控制字符。例如,逗号(,)、句号(.)、问号(?)、换行符(LF)、回车符(CR)等。

它包含了常用的字符,占用空间小、实现简单,几乎所有的计算机系统和编程语言都支持ASCII码;但对于一些中文、日文等内容就显得无能为力。

ISO 8859-1 字符集

ISO 8859-1,也称为 Latin-1,它使用8位二进制数字符集来表示256个不同的字符,其中前0-127字符与ASCII一样,128-255字符用于表示西欧语言中常用的字符、重音符号、货币符号等。

GB2312 字符集

GB2312是中国国家标准简体中文字符集,它采用最多两个字节的二进制数进行编码,其中,第一个字节称为高位字节,第二个字节称为低位字节。共收录了6763个汉字,以及682个其他字符,包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母等;它采用一个字节编码来兼容 ASCII字符集,如果一个字节二进制数的第一位为0则意味着这个字符采用一个字节进行编码。

GBK 字符集

GB2312只能表示6763个汉字,对于繁体中文、少数民族文字、日文汉字等无法表示。为了满足更广泛的中文信息处理需求,中国国家标准总局于1995年发布了GBK编码标准,它完全兼容GB2312字符集,它把中文字符集扩大到了21003个汉字但仍然有一些生僻字没有被囊括进来。

UTF-8 字符集

UTF-8几乎熟虑了全部的字符并且在不断补充中,而且也兼容ASCII字符集,它才采用1-4字节变长编码的方式:

  • 对于Unicode码在0 - 127之间的字符,使用一个字节编码;第一位为0
  • 对于Unicode码在128 - 2047之间的字符,使用两个字节编码;高字节为为110
  • 对于Unicode码在2048 - 65535之间的字符,使用三个字节编码;高字节位为1110
  • 对于Unicode码在65536及以上的字符,使用四个字节编码,高字节位为11110

Mysql中的字符集

通过show charset;命令可以查看mysql中支持的字符集,如图:

image.png 以上仅为部分字符集,其中:

  • Charset : 字符集名称;
  • Description : 字符集的描述;
  • Default collation : 默认的字符集排序;
  • Maxlen : 字符集使用的最大字节长度。

在mysql 8.0版本中默认的字符集是utf8mb4,它与上面介绍的UTF-8是同一种字符集,而mysql中的UTF-8字符集其中是正宗UTF-8字符集中的子集,它仅使用1-3字节来表示,如果想存储表情包的话需要使用utf8mb4。根据上图除了字符名称、描述、最大字节长度还有一个默认字符集排序,我们可以通过show collation like 'utf8_%'命令来查看一下utf8字符集的排序规则,如图:

image.png 在指定字符集的同时也可以指定上述排序规则,来实现我们的功能。可以看到截图中大部分都是_ci结尾的,对于排序规则的命名方式以_ci结尾的都是不区分大小写的,如果感兴趣可以自行查询一些以其他字符结尾的含义。

使用

对于mysql我们可以设置不同级别的字符集和排序规则,他们的优先级分别为字段级、表级、数据库级、mysql服务器级。命令如下:

Mysql服务器级命令:

  • character_set_server
  • collation_server

数据库级命令:

create database `db1` 
    character set utf8mb4 
    collate utf8mb4_general_ci

表级命令:

create table `t1` 
    character set utf8mb4 
    collate utf8mb4_general_ci

字段级命令:

create table `t1`
(
    a varchar(10) character set utf8mb4 collate utf8mb4_general_ci
)

总结

本篇文章介绍了什么是字符集以及常见字符集的发展史,mysql中支持哪些字符集,utf8与utf8mb4到底和UTF-8是什么关系以及如何设置我们的字符集与排序规则。


创作不易,觉得文章写得不错帮忙点个赞吧!如转载请标明出处~