第 3 章 乱码的前世今生——字符集和比较规则

3.1 字符集和比较规则简介

3.1.1 字符集简介

字符集:人们抽象出来的用来描述某个字符范围的编码规则。

3.1.2 比较规则简介

如何比较两个字符,最简单的方法是直接比较两个字符对应的二进制编码大小。但很多情况下并不适用。

3.1.3 一些重要的字符集
字符集描述大小(byte)
ASCII128个字符1
ISO8859-1扩充ASCII,256个字符1
GB2312兼容ASCII1~2
GBK兼容GB23121~2
UTF-8几乎所有字节,兼容ASCII1~4

3.2 MySQL中支持的字符集和比较规则

3.2.1 MySQL中的utf8和utf8mb4

utf8mb3:“阉割”过的UTF-8字符集,只使用1~3字节表示字符。
utf8mb4:正宗的UTF-8字符集,使用1~4字节表示字符。MySQL8.0默认字符集。

3.2.2 字符集的查看
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW CHARSET;

在这里插入图片描述

Default collation:比较规则

3.2.3 比较规则的查看
SHOW COLLATION [LIKE 匹配的模式];
SHOW COLLATION LIKE 'utf8%'

在这里插入图片描述

比较规则名称后缀英文释义及描述

在这里插入图片描述

3.3 字符集和比较规则的应用

3.3.1 各级别的字符集和比较规则

1. 服务器级别

SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';

2. 数据库级别

SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';

3. 表级别

建表时指定,可通过DDL修改。默认为该表所在数据库的字符集和比较规则。

4. 列级别

建表时指定,可通过DDL修改。默认为该列所在表的字符集和比较规则。

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

1. 编码和解码使用的字符集不一致

public static void main(String[] args) {
	String s = "我";
	// 转GBK打印
	System.out.println(new String(s.getBytes(StandardCharsets.UTF_8), Charset.forName(GBK))); // 鎴�
}

对于同一个字符串,如果编码和解码使用的字符集不一样,会产生意想不到的结果,在我们看来就像是产生了乱码一样。

2. 字符集转换的概念

0xE68891这个字节序列按归UTF-8字符集进行解码,然后又把它按照GBK字符集进行编码,编码后0xCED2。这个过程称为字符集的转换。

3. MySQL 中的字符集转换过程

  1. 客户端发送请求
  2. 服务器接收请求
  3. 服务器处理请求
  4. 服务器生成响应
  5. 客户端接收响应
3.3.3 比较规则的应用

比较规则通常用来比较字符串的大小以及对某些字符串进行排序,所以也称为排序规则。

3.4 总结

  1. 字符集指的是某个字符范围的编码规则
  2. 比较规则是对某个字符集的字符比较大小的一种规则
  3. 在 MySQL 中,一个字符集可以有多个比较规则
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值