vlambda博客
学习文章列表

Mysql支持的字符集

01

字符集是什么

计算机中实际存储的是二进制数据,如果我们有一个字符串,那么它如何存储的呢? 当然是建立自符与二进制数据的映射关系了。要建立这个关系,要搞清清两件事:

  1. 要把哪些字符映射为二进制数据?也就是界定字符的范围。

  2. 怎么映射?将字符映射为二进制数据的过程称之为编码,将二进制映射到字符的过程称之为解码。


例如我们自定义了一个字符集叫做 “knowfarhhy” 字符集,规则如下:

  • 包含字符 'a ' ,   'b' ,  'A' ,  'B'

  • 字符和字节的映射关系如下:

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

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

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

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

根据字符集规则,那么我们便可达到如下结论:

  • 'bA' -> 0000001000000011 (0x020x03)

  • 'cd' - > 无法表示,超出了该字符集字符范围



02

常见字符集


  1. ASCII字符集:共收录128个字符,包括了空格、标点符号、数字、大小写字母和一些不可见字符,由于其总过128个字符,所以可以使用一个字节进行编码。


  2. ISO 8859-1字符集:共收录了256个字符,给予ASCII字符集进行了扩充,增加了128个西欧常用字符,别名Latin 1。


  3. GB2312字符集:收录了汉子以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母,收录汉字6763个,其他文字符号682。兼容ASCII字符集,所以在编码方式上是一种变长编码方式,如果在ASCII字符集内那么是一个字节,否则是两个字节。


  4. GBK字符集:对GB2312字符集扩充。


  5. UTF-8字符集:几乎收录了当今世界各个国家/地区使用的字符,采用变长编码方式,编码一个字符需要1~4字节,例如 'L'-> 01001100 一个字节;'啊' -> 111001011001010110001010 三个字节 。


等等


03

Mysql支持的字符集


如何查看Mysql支持的字符集?

SHOW CHARSET;
xxxxxxxx41 rows in set (0.01 sec)

一共支持了41中字符集,部分如下:

其中最后一列MaxLen代表该字符集使用的最大字节数;

Default Collation列表示这种字符集中一种默认的比较规则。

Mysql支持的字符集

提示

字符映射的字节长度,在某些方面会影响系统的存储以及性能。之前我们说过UTF-8是使用额1~4字节映射一个字符,但是在Mysql中UTF-8使用的最多是3个字节,因为3个字节可以表示大部分常用的字符,如果对于存储一些emoji表情需要使用ut8mb4字符集。


04

字符集比较规则


例如我们有两个个字符串'ac' 和 'cd' ,如果我们想要对其进行比较, 肯定是需要一个比较规则的,每种字符集的比较规则可能是不一样,甚至一个字符集也会存在多种的比较规则。


如何查看Mysql支持的字符集以及相应的规则:

SHOW COLLATION;xxxxxxxxxx222 rows in set (0.00 sec)

Mysql支持的字符集


222个比较规则,我们可以通过LIKE语法查看自己需要的字符集的比较规则:

SHOW COLLATION LIKE 'utf8\_%';xxxxxxxx 27 rows in set (0.00 sec)

一共有27种:

Mysql支持的字符集



我们对命名稍作解释,

  • 比较规则的开头是以其字符集的名称开头,

  • 后面紧跟着比较规则所应用的语言,例如utf8_spanish_ci是表示西班牙语的比较规则,utf8_polish_ci表示波兰语的比较规则。

  • 名称中的后缀解释如下


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


Default列,即上面图片中第4列,如果为Yes表示为该字符集默认比较规则。


05

字符集和比较规则应用



Mysql有4个级别的字符集和比较规则,分别有服务区级别、数据库级别、表级别、列级别,下面我们分别介绍。


  1. 服务器级别


SHOW VARIABLES LIKE 'character_set_server';



SHOW VARIABLES LIKE 'collation_server';


启动服务器程序时,可以通过启动项目或者在服务器程序运行过程中使用SET语句来修改。


2. 数据库级别


//创建时候设置CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称    COLLATE 比较规则名称;    //修改ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称 COLLATE 比较规则名称;    // 查看字符集和比较规则USE 数据库名称;    SHOW VARIABLES LIKE 'character_set_database';SHOW VARIABLES LIKE 'collation_database';


3. 表级别

//创建时候设置CREATE TABLE 表名 (列信息) CHARACTER SET 字符集名称 COLLATE 比较规则名称; //修改ALTER TABLE 表名 CHARACTER SET 字符集名称 COLLATE 比较规则名称;  // 查看字符集和比较规则show create table 表名;


4. 列级别

//创建时候设置CREATE TABLE 表名 (    列名 字符串类型 CHARACTER SET 字符集名称 COLLATE 比较规则名称,    其他列 ); //修改ALTER TABLE 表名 MODIFY 列名 字符串类型  CHARACTER SET 字符集名称 COLLATE 比较规则名称;  // 查看字符集和比较规则show create table 表名;