字符集
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;
一般来说,应该让字段的字符集和排序规则与数据表的保持一致,因此不要在字段级别指定和修改字符集和排序规则。