Mysql支持的字符集
01
字符集是什么
计算机中实际存储的是二进制数据,如果我们有一个字符串,那么它如何存储的呢? 当然是建立自符与二进制数据的映射关系了。要建立这个关系,要搞清清两件事:
要把哪些字符映射为二进制数据?也就是界定字符的范围。
怎么映射?将字符映射为二进制数据的过程称之为编码,将二进制映射到字符的过程称之为解码。
例如我们自定义了一个字符集叫做 “knowfarhhy” 字符集,规则如下:
包含字符 'a ' , 'b' , 'A' , 'B'
字符和字节的映射关系如下:
'a' -> 00000001 (十六进制0x01)
'b' -> 00000010 (十六进制0x02)
'A' -> 00000011 (十六进制0x03)
'B' -> 00000100 (十六进制0x04)
根据字符集规则,那么我们便可达到如下结论:
'bA' -> 0000001000000011 (0x020x03)
'cd' - > 无法表示,超出了该字符集字符范围
02
常见字符集
ASCII字符集:共收录128个字符,包括了空格、标点符号、数字、大小写字母和一些不可见字符,由于其总过128个字符,所以可以使用一个字节进行编码。
ISO 8859-1字符集:共收录了256个字符,给予ASCII字符集进行了扩充,增加了128个西欧常用字符,别名Latin 1。
GB2312字符集:收录了汉子以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母,收录汉字6763个,其他文字符号682。兼容ASCII字符集,所以在编码方式上是一种变长编码方式,如果在ASCII字符集内那么是一个字节,否则是两个字节。
GBK字符集:对GB2312字符集扩充。
UTF-8字符集:几乎收录了当今世界各个国家/地区使用的字符,采用变长编码方式,编码一个字符需要1~4字节,例如 'L'-> 01001100 一个字节;'啊' -> 111001011001010110001010 三个字节 。
等等
03
Mysql支持的字符集
如何查看Mysql支持的字符集?
SHOW CHARSET;
xxxx
xxxx
41 rows in set (0.01 sec)
一共支持了41中字符集,部分如下:
其中最后一列MaxLen代表该字符集使用的最大字节数;
Default Collation列表示这种字符集中一种默认的比较规则。
提示
字符映射的字节长度,在某些方面会影响系统的存储以及性能。之前我们说过UTF-8是使用额1~4字节映射一个字符,但是在Mysql中UTF-8使用的最多是3个字节,因为3个字节可以表示大部分常用的字符,如果对于存储一些emoji表情需要使用ut8mb4字符集。
04
字符集比较规则
例如我们有两个个字符串'ac' 和 'cd' ,如果我们想要对其进行比较, 肯定是需要一个比较规则的,每种字符集的比较规则可能是不一样,甚至一个字符集也会存在多种的比较规则。
如何查看Mysql支持的字符集以及相应的规则:
SHOW COLLATION;
xxxxxx
xxxx
222 rows in set (0.00 sec)
222个比较规则,我们可以通过LIKE语法查看自己需要的字符集的比较规则:
SHOW COLLATION LIKE 'utf8\_%';
xxxx
xxxx
27 rows in set (0.00 sec)
一共有27种:
我们对命名稍作解释,
比较规则的开头是以其字符集的名称开头,
后面紧跟着比较规则所应用的语言,例如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个级别的字符集和比较规则,分别有服务区级别、数据库级别、表级别、列级别,下面我们分别介绍。
服务器级别
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 表名;