1、常见的字符集

字符集名称 字符集简介 占用大小
ASCII 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符 1字节
ISO 8859-1(Latin1) 共收录256个字符,在ASCII的基础上又扩充了128个西欧常用字符(包括德法两国字符) 1字节
GB2312 收录了汉字以及拉丁字母,希腊字母、日文平假名及片假名字母,俄语西里尔字母,收录汉字6763个,收录其它文字符号682个 如果该字符在ASCII字符集中则使用1字节,否则使用两字节
GBK GBK在GB2312字符集的基础上进行扩充,编码方式兼容GB2312
UTF-8 几乎收录了当今世界上各个国家/地区使用的字符,并且在不断扩充。该字符集兼容ASCII字符集 采用变长编码方式,编码一个字符时需要1~4个字节
·一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
·带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
·其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
·其他极少使用的语言字符使用4字节编码

2、mysql中支持的字符集和比较规则

mysql中utf8是utf8mb3的别名 ,如果有使用4个字节编码一个字符的情况,比如存储emoji表情,则需要使用utf8mb4 utf8mb4为mysql8的默认字符集

utf8mb3 阉割过的UTF-8字符集,使用1到3个字节表示字符
utf8mb4 正宗的UTF-8字符集,使用1-4个字节表示字符

  1. #查看字符集
  2. show CHARSET;
  3. #查看比较规则
  4. show COLLATION;

3、字符集和比较规则的应用

3.1、各级别字符集和比较规则

mysql有4个级别的字符集和比较规则,分别为服务器级别、数据库级别、表级别和列级别

优先级:

如果创建列时没有显示的指定字符集和比较规则,则该列默认使用表的字符集和比较规则
如果创建表时没有显示的指定字符集和比较规则,则默认使用该数据库的字符集和比较规则
如果创建数据库时没有显示的指定字符集和比较规则,则默认使用该服务器的字符集和比较规则

服务器级别

mysql提供了两个系统变量表示服务器级别的字符集和比较规则

  1. show variables like 'CHARACTER_SET_SERVER'; #utf8
  2. show variables like 'COLLATION_SERVER'; #utf8_general_ci

数据库级别
**
在创建和修改数据库时可以指定该数据库的字符集和比较规则

CHARACTER_SET_DATABASE和COLLATION_DATABASE只能查看数据库的字符集和比较规则,并不能通过修改这两个值来改变当前数据库的字符集和比较规则

查看数据库的字符集和比较规则

  1. show variables like 'CHARACTER_SET_DATABASE'; #utf8mb4
  2. show variables like 'COLLATION_DATABASE'; #utf8mb4_bin

表级别

在创建和修改表的时候指定表的字符集和比较规则

CREATE TABLE `order` (
  `order_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `order_amount` decimal(10,0) DEFAULT NULL COMMENT '订单金额',
  `order_status` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单状态',
  `create_user` int(10) DEFAULT NULL COMMENT '下单人',
  `create_time` datetime DEFAULT NULL COMMENT '下单时间',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `update_time` datetime DEFAULT NULL COMMENT '更改时间',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=447 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

列级别

在创建和修改列的时候指定表的字符集和比较规则

CREATE TABLE `order` (
  `order_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `order_amount` decimal(10,0)  DEFAULT NULL COMMENT '订单金额',
  `order_status` varchar(10) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL COMMENT '订单状态',
  `create_user` int(10) DEFAULT NULL COMMENT '下单人',
  `create_time` datetime DEFAULT NULL COMMENT '下单时间',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `update_time` datetime DEFAULT NULL COMMENT '更改时间',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=447 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3.2、客户端和服务端通信过程中使用的字符集

  • 客户端发送的请求的字节序列是采用哪种字符集进行编码的?

取决于操作系统当前使用的字符集,对window操作系统而言还和客户端启动时设置的default-character-set启动项有关

  • 服务器接收到请求字节序列后会认为它是采用哪种字符集进行编码的?

取决于系统变量charcater_set_client

  • 服务器在运行过程中会把请求的字节序列转换为哪种字符集编码的字节序列

取决于系统变量charcater_set_connection

  • 服务器向客户端返回字节序列时是采哪种字符集进行编码的?

取决于系统变量charcater_set_result