MySQL 字符集

字符集

mysql 8.0 及以后版本,字符集默认设置成 utf8mb4,8.0 版本之前默认的字符集为 latin1。

# 查看所有字符集
mysql> show charset;
# 查看所有排序规则
mysql> show collation;
# 查看 utf8mb4 字符集的所有排序规则
mysql> show collation like 'utf8mb4%';

排序规则 collation

排序规则(collation)是比较和排序字符串的一种规则。一个字符集有多个排序规则,但是每个排序规则只能属于一个字符集。每个字符集都有一个默认的排序规则,utf8mb4 字符集的默认排序规则 utf8mb4_0900_ai_ci,如果只指定了字符集,没有指定排序规则,则使用该字符集的默认排序规则。

以 _ci 结尾的排序规则,表示不区分大小写(case insentive),_cs 表示大小写敏感,_bin 表示通过存储字符的二进制进行比较。通常情况不需要区分大小写,因此各个字符集默认的排序规则都是 _ci 结尾的。

通常情况下,不需要指定 collation,使用各个字符集的默认排序规则即可

utf8 和 utf8mb4

标准 utf8:属于 ASCII 字符集的字符用一个字节存储,带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母需要两个字节,汉字需要三个字节,辅助平面四个字节。

MySQL 的 utf8:不包括辅助平面
MySQL 的 utf8mb4:与标准 utf8 相同,推荐

推荐字符集:'utf8mb4'
推荐排序规则:'utf8mb4_0900_ai_ci'

推荐使用 utf8mb4 字符集,不要使用 utf8 字符集。

设置字符集

服务器级别

待测

数据库级别

如果创建数据库的时候没有指定字符集和排序规则,则使用服务器级别的字符集和排序规则。

CREATE DATABASE `xiamiaomiao`;

创建数据库的时候,可以手动指定字符集和排序规则。

CREATE DATABASE `xiamiaomiao`
DEFAULT CHARSET='utf8mb4' COLLATE='utf8mb4_0900_ai_ci';

可以省略 DEFAULT,可以省略 =,可以省略 ',效果相同。

CREATE DATABASE `xiamiaomiao`
CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

数据表级别

如果创建数据表的时候没有指定字符集和排序规则,则使用数据库级别的字符集和排序规则。

CREATE TABLE `test`(
    `c3` CHAR(3),
    `v3` VARCHAR(3)
);

可以为数据表手动指定字符集和排序规则

CREATE TABLE `test`(
    `c3` CHAR(3),
    `v3` VARCHAR(3)
)CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

修改数据表的字符集和排序规则

ALTER TABLE `test`
CHARSET utf8 COLLATE utf8_bin;

以上这样修改数据表的字符集和排序规则,只会作用于新增的字段,已有字段的字符集不会改变。如果想修改已有字段的字符集,需要如下设置:

ALTER TABLE `test`
CONVERT TO
CHARSET utf8 COLLATE utf8_bin;

以上方式修改的字符集和排序规则,会作用于新增的字段和已有的字段。

如果创建数据表的SQL语句需要在不同的服务器上执行,最好在创建表的时候指定字符集,因为你不能保证每个服务器上的数据库的默认字符集都是 utf8mb4

字段级别

如果创建字段的时候没有指定字符集和排序规则,则使用数据表级别的字符集和排序规则。以下 c3 和 v3 两个字段的字符集为 utf8mb4,排序规则为 utf8mb4_0900_ai_ci。

CREATE TABLE `test`(
    `c3` CHAR(3),
    `v3` VARCHAR(3)
)CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

可以为字段手动指定字符集和排序规则,以下 c3 字段采用手动指定的字符集和排序规则,v3 字段采用数据表的字符集和排序规则。

CREATE TABLE `test`(
    `c3` CHAR(3) CHARSET utf8 COLLATE utf8_bin,
    `v3` VARCHAR(3)
)CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

修改字段的字符集和排序规则

ALTER TABLE `test`
MODIFY `c3` CHAR(3) CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

一般来说,应该让字段的字符集和排序规则与数据表的保持一致,因此不要在字段级别指定和修改字符集和排序规则

你可能感兴趣的:(MySQL 字符集)