MySQL 8.x字符集和Collation设置轻松入门
MySQL 正式版 8.0.26已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能。

查看MySQL版本号:mysql --version

演示CentOS 8中安装部署和配置 MySQL 8.0 的完整过程
一、CharacterSet和Collation简述
A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.
Character Set: 一套字符及其编码,即字符集;
Collation:在字符集内用于比较或排序字符的一套规则,即校验规则。
- MySQL服务器支持多种字符集(Character Set)
- 每个字符集至少有一个Collation
- 大部分字符集都有多个Collation
- 每个字符集都有一个默认的Collation
- 两个不同的字符集不会有相同的Collation
- MySQL可以在服务器、数据库、表或字段 级别 指定使用的字符集
下面是一些常见的Collation后缀:

二、查看MySQL Server默认字符集
MySQL官方文档可查看默认的Charset和Collation:
- <=5.7 doc MySQL Server 5.7或之前版本默认的Charset和Collation是: latin1 和 latin1_swedish_ci
- 8.x doc MySQL Server 8.x(当前版本)默认的Charset和Collation是: utf8mb4 和 utf8mb4_0900_ai_ci
查看MySQL Server当前的Charset和Collation:
show variables like 'character_set_server';
show variables like 'collation_server';
或者使用语句:
select @@character_set_server, @@collation_server;

默认的charset是utf8mb4, 而且 utf8mb4 默认的collation是 utf8mb4_0900_ai_ci。
或者使用如下命令查看:
show variables like 'character%';
show variables like 'collation%';

MySQL中utf8字符集使用三个字节编码一个字符,自2004(MySQL 4.1)年被引入,能够支持绝大多数语言,但依然有些字符不能正确编码,如表情字符,为此MySQL 5.5引入了utf8mb4字符集,提供了另一种选择。在MySQL 5.7对utf8mb4进行了大幅优化,并丰富了校验字符集。
MySQL 8 默认编码使用utf8mb4,utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
MySQL数据库的 "utf8"并不是真正概念里的 UTF-8,MySQL中的"utf8"编码只支持最大3字节每字符,真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。
三、数据库(Database)的Charset和Collation
创建数据库的时候,如果没有指定character set 和 collation,会自动用MySQL Server的 character set和collation。
(1)查看数据的Character Set和Collation
USE db_name;
SELECT @@character_set_database, @@collation_database;

不想改变当前数据库的话,可以使用语句:
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
(2)指定或修改数据库(Database)的Character Set和Collation
创建db时指定:
CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
修改:
ALTER DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
四、表(Table)的Charset和Collation
如果创建表的时候没有指定表级别Charset和Collation,会默认使用数据库(Database)的Charset和Collation。
查看表(Table)的Charset和Collation
SELECT
t.TABLE_SCHEMA,
t.table_name,
ccsa.*
FROM
information_schema.`TABLES` t,
information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` ccsa
WHERE ccsa.collation_name = t.table_collation
AND t.table_schema = "db_name"
AND t.table_name = "table_name";

指定或修改表(Table)的Character Set和Collation
CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]]
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]
五、列(Column)的Charset和Collation
如果创建表的时候没有指定列的Charset和Collation,会默认使用表(Table)的Charset和Collation。
查看列(Column)的Charset和Collation
SELECT
*
FROM information_schema.`COLUMNS`
WHERE table_schema = "db_name"
AND table_name = "table_name";
