MySQL中的CHARSET和COLLATE关键字

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 BYDISTINCTGROUP BY等命令时都会涉及到该属性。另外我们在对表建索引时,如果索引列是字符类型,那么COLLATE属性也会影响到索引的创建。

COLLATE通常是和字符编码CHARSET相关的,每种CHARSET都对应了多种它所支持的COLLATE,并且会指定一个默认COLLATE。比如utf8mb4编码的默认COLLATE为utf8mb4_general_ci,对于中文场景来说,其实utf8mb4_unicode_ciutf8mb4_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中对这些属性的配置是会逐层继承的,比如我们已经指定数据库的默认编码,那么创建表的时候就不需要指定了,会自动从上层继承下来。


参考资料:

  1. MySQL字符集设置
  2. MYSQL中的COLLATE是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值