MySQL中使用命令SHOW CREATE TABLE t
可以查看建表语句,如下所示,我们可以看到描述中有两个关键字CHARSET和COLLATE,其中CHARSET可能很多人都大概知道,但是对COLLATE了解的人可能就比较少了。这篇文章就简单介绍一下MySQL中的CHARSET和COLLATE这两个关键字。
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1. CHARSET
CHARSET表示数据编码方式,在MySQL中可以使用命令show variables like 'character_set_%';
查看系统默认编码集。
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
在我们的业务场景中因为经常会涉及到中文,常用的编码方式就是utf-8
,但是在MySQL中的utf8
编码其实并不是我们平时使用的utf-8
编码,正确的对应编码是utf8mb4
,在MySQL中utf8
编码最多只能支持3 bytes长度的字符编码,对于一些需要占用4 bytes的字符使用utf8
编码方式就不支持了,需要使用utf8mb4
才行,这是MySQL的一个遗留问题。
我们在使用MySQL时,如果使用的是5.7及以前的版本,需要我们手动将编码方式配置为utf8mb4
,如果使用的是版本8+则默认就是该编码了,不需要我们再修改了。修改MySQL默认字符集,可以在/etc/my.cnf
配置文件中修改对应的编码即可,注意不同的版本修改方式可能有些不太一样。
2. COLLATE
COLLATE属性用于指定列的排序和比较方式,我们在使用ORDER BY
、DISTINCT
、GROUP BY
等命令时都会涉及到该属性。另外我们在对表建索引时,如果索引列是字符类型,那么COLLATE属性也会影响到索引的创建。
COLLATE通常是和字符编码CHARSET相关的,每种CHARSET都对应了多种它所支持的COLLATE,并且会指定一个默认COLLATE。比如utf8mb4
编码的默认COLLATE为utf8mb4_general_ci
,对于中文场景来说,其实utf8mb4_unicode_ci
和utf8mb4_general_ci
没有什么区别。我们可以使用命令show collation;
查看MySQL所支持的COLLATE。
我们会发现,很多COLLATE里面都带有_ci
后缀,这是Case Insensitive
的缩写,表示大小写无关。对应的_cs
后缀表示大小写敏感。
需要注意的是,在MySQL 8+版本中,默认的CHARSET直接改成了utf8mb4
,对应的默认COLLATE也改成了utf8mb4_0900_ai_ci
,这是unicode
的一个细分,就相当于utf8mb4_unicode_ci
。
3. 总结
这篇文章就简单介绍了一下MySQL中的CHARSET和COLLATE属性,其中CHARSET表示字符编码,COLLATE主要用于列的比较,在MySQL中对这些属性的配置是会逐层继承的,比如我们已经指定数据库的默认编码,那么创建表的时候就不需要指定了,会自动从上层继承下来。
参考资料: