什么是字符集(character set)
字符的二进制编码方式
二进制编码到一套字符的映射
二进制 ->编码 ->字符
校对规则(collation)
在字符集内用于比较字符的一套规则
ASCII 码
1 个字节由 8 个二进制位组成
1 个字节可表示 256 种不同的状态(256 个不同符号)
ASCII 码规定了 128 个字符 (英文字符和一些标点符号) 的编码
Unicode 国际化支持
世界上存在多种编码方式, 同一个二进制数字被解释成了不同的符号
现存 编码 不能在多语言环境中使用, 诞生了 Unicode(统一码)
一个字符的 Unicode 编码是确定的
Unicode 编码实现方式各不相同
Unicode 的实现方式称为 Unicode 转化格式(UTF)
UTF-8
UTF-8 是 Unicode 的实现方式之一
其它实现方式还有 UTF-16, UTF-32
变长编码, 一个符号使用 1~4 个字节表示
utf8 是 MySQL 存储 Unicode 数据的一种可选方法
utf8
MySQL 中实现了 UTF-8 编码的 unicode 字符集
MySQL 中 utf8 是 utf8mb3 的别名
utf8 中, 一个符号使用 1~3 个节点表示
对 UTF-8 支持不彻底, 可采用 utf8mb4 字符集
utf8 与 utf8mb4 的关系
都是实现了 UTF-8 编码的 unicode 字符集
utf8 仅支持基本多语言平面 Basic Multilingual Plane (BMP)
utf8mb4 支持 BMP 之外的补充字符(如 emoji,emoji 是一种特殊的 Unicode 编码)
utf8 一个字符最多使用 3 个字节存储, utf8mb4 一个字符最多使用 4 个字节存储
对于 BMP 字符, utf8 和 utf8mb4 具有相同的编码, 相同的长度
对于非 BMP 字符, utf8mb4 使用 4 个字节来存储, utf8 不能存储非 BMP 字符
innodb 中默认最大可对 767 个字节建立索引
使用 utf8 的列最多可对 255 个字符建立索引
使用 utf8mb4 的列最多可对 191 个字符建立索引
超集
字符集 A,B ,B 支持的所有字符 A 都支持, A 是 B 超集
比如 GBK 字符集是 GB2312 字符集的超集, 它们又都是 ASCII 字符集的超集
utf8mb4 是 utf8 的超集
字符集设置
set names x 等价于
- set character_set_client=x;
- set character_set_connection=x;
- set character_set_results=x;
--default-character-set 用户连接时设置字符集 等价于
- set character_set_client=x;
- set character_set_connection=x;
- set character_set_result=x;
- init-connect=set names binary
让 client 和 server 交互的时候以 什么模式 (不做任何转化) 来传送
default-character-set
设置 [MySQL] 和[client] 中的字符集
character-set-server
设置[mysqld] 进程的默认字符集
collation-server
设置[mysqld] 进程的默认校对规则
utf8_general_ci 查找, 排序不区分大小写
utf8_bin 查找, 排序区分大小写
来源: http://www.linuxidc.com/Linux/2019-04/158337.htm