1. utf8mb4_general_ci
vs utf8mb4_bin
的具体区别
utf8mb4_general_ci
和 utf8mb4_bin
都是 utf8mb4 编码的排序规则(collation),它们主要在 排序(ORDER BY) 和 比较(WHERE) 时的行为不同:
排序规则 | 是否区分大小写 | 是否区分重音 | 速度 | 适用场景 |
---|---|---|---|---|
utf8mb4_general_ci |
❌ 不区分 | ❌ 不区分 | ✅ 更快 | 适用于一般文本,如用户名、标题 |
utf8mb4_bin |
✅ 区分 | ✅ 区分 | ⛔ 更慢 | 适用于密码、唯一标识符 |
(1) utf8mb4_general_ci
(Case-Insensitive,不区分大小写)
- CI 代表 “Case Insensitive”,表示比较时 不区分大小写,也 不区分重音符号。
- 例如:
SELECT 'a' = 'A'; -- 结果是 TRUE SELECT 'résumé' = 'resume'; -- 结果是 TRUE
utf8mb4_general_ci
主要适用于 对大小写或重音符号不敏感的文本(如用户名、标签等)。
(2) utf8mb4_bin
(Binary,区分大小写)
-
utf8mb4_bin
按照 二进制编码 逐字节进行比较,因此大小写、重音符号完全不同。 - 例如:
SELECT 'a' = 'A' COLLATE utf8mb4_bin; -- 结果是 FALSE SELECT 'résumé' = 'resume' COLLATE utf8mb4_bin; -- 结果是 FALSE
utf8mb4_bin
适用于 严格区分大小写的场景(如密码、文件名、唯一标识符)。
2. 除了 utf8mb4_general_ci
和 utf8mb4_bin
,还有哪些?
utf8mb4
编码有多种排序规则,主要区别在于:
- 是否区分大小写
- 是否区分重音
- 排序算法
(1) 常见的 utf8mb4
排序规则
排序规则 | 是否区分大小写 | 是否区分重音 | 适用场景 |
---|---|---|---|
utf8mb4_general_ci |
❌ 不区分 | ❌ 不区分 | 一般文本,如用户名、标题 |
utf8mb4_general_cs |
✅ 区分 | ❌ 不区分 | 需要区分大小写但不区分重音的场景 |
utf8mb4_unicode_ci |
❌ 不区分 | ✅ 区分 | 多语言支持,如 é ≠ e
|
utf8mb4_unicode_cs |
✅ 区分 | ✅ 区分 | 多语言场景,严格匹配 |
utf8mb4_bin |
✅ 区分 | ✅ 区分 | 密码、唯一标识符 |
(2) utf8mb4_general_ci
vs utf8mb4_unicode_ci
特性 | utf8mb4_general_ci |
utf8mb4_unicode_ci |
---|---|---|
是否区分大小写 | ❌ 不区分 | ❌ 不区分 |
是否区分重音 | ❌ 不区分 | ✅ 区分 |
是否符合 Unicode 规则 | ⛔ 不完全符合 | ✅ 符合 Unicode 排序规则 |
速度 | ✅ 快 | ⛔ 稍慢 |
-
utf8mb4_general_ci
适用于性能优先的应用,它的比较方式比较简单,不完全符合 Unicode 规则。 -
utf8mb4_unicode_ci
适用于多语言支持,比如 德语的 ß 应该等于 ss,但utf8mb4_general_ci
可能不会正确处理。
3. 选择排序规则的建议
-
大小写不敏感、不关注重音:
utf8mb4_general_ci
(性能更快) -
大小写不敏感、但区分重音:
utf8mb4_unicode_ci
(多语言支持更好) -
大小写敏感、但不区分重音:
utf8mb4_general_cs
-
大小写敏感、也区分重音:
utf8mb4_unicode_cs
-
严格区分大小写、适用于 ID/密码等:
utf8mb4_bin
5. 总结
-
utf8mb4_general_ci
:不区分大小写、不区分重音,适用于一般文本。 -
utf8mb4_bin
:严格区分大小写和重音,适用于唯一标识符(如密码、UUID)。 -
utf8mb4_unicode_ci
:符合 Unicode 规则,适用于多语言支持。
适合用中文的是?
如果你的数据包含中文,建议使用 utf8mb4_unicode_ci
或 utf8mb4_unicode_520_ci
,因为它们能够更准确地进行排序和比较。下面是不同排序规则在处理中文时的特点:
1. utf8mb4_general_ci
vs. utf8mb4_unicode_ci
处理中文的区别
排序规则 | 是否区分大小写 | 是否区分重音 | 是否适合中文 | 排序规则准确性 |
---|---|---|---|---|
utf8mb4_general_ci |
❌ 不区分 | ❌ 不区分 | ⚠️ 基本支持,但排序不准确 | ???? 较差 |
utf8mb4_unicode_ci |
❌ 不区分 | ✅ 区分 | ✅ 更适合中文,符合 Unicode 规范 | ✅ 准确 |
utf8mb4_unicode_520_ci |
❌ 不区分 | ✅ 区分 | ✅ 最新 Unicode 规则,适合中文 | ✅ 更准确 |
utf8mb4_bin |
✅ 区分 | ✅ 区分 | ❌ 不适合中文排序(仅适用于精确匹配,如密码) | ???? 排序无意义 |
2. 为什么 utf8mb4_general_ci
不适合中文?
utf8mb4_general_ci
主要是针对拉丁字符优化,它对汉字的处理方式较为简单,可能会导致 排序不符合中文习惯,例如:
SELECT '中' > '啊' COLLATE utf8mb4_general_ci;
-
utf8mb4_general_ci
可能会 按照字符编码顺序 排序,而不是按拼音或部首排序,这样会出现 “中” 排在 “啊” 之前,这并不符合常见的中文排序规则。
3. utf8mb4_unicode_ci
更适合中文
-
utf8mb4_unicode_ci
遵循 Unicode 标准,能够正确地比较和排序 汉字、拼音、部首,在处理中文时比utf8mb4_general_ci
更准确。 - 例如:
在SELECT '中' > '啊' COLLATE utf8mb4_unicode_ci;
utf8mb4_unicode_ci
规则下,“啊” 会排在 “中” 之前,符合拼音排序规则(A
在Z
之前)。
4. utf8mb4_unicode_520_ci
适用于最新 Unicode 标准
-
utf8mb4_unicode_520_ci
是 Unicode 5.2 版本的排序规则,它在utf8mb4_unicode_ci
的基础上 进一步优化了字符排序,对于现代 Unicode 处理更完善。 - 例如:
在SELECT '????' > '中' COLLATE utf8mb4_unicode_520_ci;
utf8mb4_unicode_520_ci
下,可以正确处理扩展汉字,避免某些生僻字排序错误。
5. 选择适合中文的排序规则
适用场景 | 推荐排序规则 |
---|---|
普通中文文本(适用于大多数情况) | utf8mb4_unicode_ci |
最新 Unicode 规则(支持扩展汉字) | utf8mb4_unicode_520_ci |
大小写敏感,适用于特定情况 | utf8mb4_unicode_cs |
严格区分大小写和重音(如密码存储) | utf8mb4_bin |
6. 结论
✅ 如果你存储中文,并且希望排序、比较符合 Unicode 规范,推荐:
utf8mb4_unicode_ci
✅ 如果你希望使用最新 Unicode 5.2 标准,并支持更多生僻字,推荐:
utf8mb4_unicode_520_ci
⚠️ 避免 utf8mb4_general_ci
,因为它不适用于中文排序 ????
utf8mb4_unicode_520_ci 是mysql5.7 有吗?
✅ utf8mb4_unicode_520_ci
在 MySQL 5.7 是支持的!
1. utf8mb4_unicode_520_ci
在 MySQL 版本的支持情况
排序规则 | MySQL 5.5 | MySQL 5.6 | MySQL 5.7 | MySQL 8.0 |
---|---|---|---|---|
utf8mb4_general_ci |
✅ 支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
utf8mb4_unicode_ci |
✅ 支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
utf8mb4_unicode_520_ci |
❌ 不支持 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
MySQL 5.7 引入了 utf8mb4_unicode_520_ci
,它基于 Unicode 5.2 标准,相比 utf8mb4_unicode_ci
(基于 Unicode 4.0),提供了更准确的字符排序,尤其是对于 扩展汉字、emoji、某些特殊符号。
2. 如何在 MySQL 5.7 检查 utf8mb4_unicode_520_ci
是否可用?
运行以下 SQL 语句:
SHOW COLLATION WHERE Collation LIKE 'utf8mb4_unicode_520_ci';
如果返回结果,说明 MySQL 5.7 支持该排序规则 ✅。
如果没有结果,可能是 MySQL 版本较低(如 5.6 或 5.5),可以运行:
SELECT VERSION();
检查 MySQL 版本。
3. 在 MySQL 5.7 中使用 utf8mb4_unicode_520_ci
创建表
CREATE TABLE test_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) COLLATE utf8mb4_unicode_520_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
修改表的排序规则
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
修改数据库默认排序规则
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
4. utf8mb4_unicode_520_ci
vs utf8mb4_unicode_ci
规则 | utf8mb4_unicode_ci |
utf8mb4_unicode_520_ci |
---|---|---|
Unicode 版本 | Unicode 4.0 | Unicode 5.2 |
生僻字 & emoji 处理 | ❌ 可能不准确 | ✅ 更准确 |
法语、德语等特殊字符排序 | ❌ 不完整 | ✅ 更符合规范 |
扩展汉字 & 拼音排序 | ✅ 较好 | ✅ 更好 |
5. 结论
✅ MySQL 5.7 支持 utf8mb4_unicode_520_ci
,适用于 更准确的中文排序
✅ 如果是 MySQL 5.6 或更早版本,utf8mb4_unicode_520_ci
不可用,可以用 utf8mb4_unicode_ci
代替