MySQL utf8mb4_unicode_ci vs utf8mb4_bin
MySQL是一个广泛使用的关系型数据库管理系统,支持多种字符集和排序规则。在MySQL 5.5.3及更高版本中,引入了utf8mb4字符集,用于处理超过3个字节的Unicode字符。但是,对于排序规则,utf8mb4_unicode_ci和utf8mb4_bin是两个常见的选项,它们的区别显而易见。
阅读更多:MySQL 教程
utf8mb4_unicode_ci
utf8mb4_unicode_ci(也称为UCA)是基于Unicode标准的一种排序规则。它使用Unicode Collation Algorithm对字符进行排序和比较。在使用这种排序规则时,MySQL会将每个字符转换成Unicode码点,然后根据Unicode标准进行排序。
示例代码:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这段代码创建了一个名为“users”的表,这个表的“name”列使用utf8mb4_unicode_ci排序规则。
如果我们向这个表中插入以下数据:
INSERT INTO `users` (`name`) VALUES ('张三'),('李四'),('田七'),('王五'),('Alan');
那么,当我们使用以下查询时,我们将得到下面的结果:
SELECT * FROM `users` ORDER BY `name`;
id | name |
---|---|
5 | Alan |
1 | 张三 |
2 | 李四 |
4 | 王五 |
3 | 田七 |
我们可以看到,这些行按照姓名的字母顺序排序,尽管名字中包含不同的Unicode字符。
utf8mb4_bin
utf8mb4_bin是区分大小写的排序规则。当使用这种排序规则时,MySQL会将所有字符按照它们的二进制值进行排序。
示例代码:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
这段代码创建了一个名为“users”的表,这个表的“name”列使用utf8mb4_bin排序规则。
如果我们向这个表中插入与之前相同的数据,那么当我们使用以下查询时,将得到不同的结果:
SELECT * FROM `users` ORDER BY `name`;
id | name |
---|---|
5 | Alan |
2 | 李四 |
1 | 张三 |
4 | 王五 |
3 | 田七 |
我们可以看到,这些行按照字符的二进制值排序,与字符中的Unicode码点无关。
总结
在MySQL中,utf8mb4_unicode_ci和utf8mb4_bin是两种不同的排序规则。utf8mb4_unicode_ci使用Unicode Collation Algorithm进行排序,而utf8mb4_bin则根据字符的二进制值进行排序。因此,在选择排序规则时,需要根据实际需要选择不同的规则。一般来说,如果需要对多语言文本进行排序,那么应该使用utf8mb4_unicode_ci,因为它能够正确地排序包含不同Unicode字符的文本。如果需要区分大小写并根据精确的字符值排序,那么应该选择utf8mb4_bin。