utf8mb4_bin 与 utf8mb4_generate_cli区别
在 MySQL 中,utf8mb4_bin
和 utf8mb4_general_ci
是两种不同的字符集排序规则(collation),主要区别体现在排序方式和大小写 /accent(重音符号)敏感性上,适用于不同的业务场景。
1. 核心区别
特性 | utf8mb4_bin | utf8mb4_general_ci |
---|---|---|
排序方式 | 按字符的二进制编码值排序 | 按通用规则排序(不严格区分细节) |
大小写敏感性 | 敏感(A ≠ a ) | 不敏感(A = a ) |
重音符号敏感性 | 敏感(é ≠ e ) | 不敏感(é = e ) |
适用场景 | 需精确匹配(如密码、唯一标识) | 常规文本查询(如用户名、内容搜索) |
2. 详细说明
(1)utf8mb4_bin
- 二进制排序:直接根据字符的 Unicode 编码值(二进制)进行比较和排序。例如:
'A'
(编码 0x41)和'a'
(编码 0x61)被视为不同字符。'é'
(编码 0xC3A9)和'e'
(编码 0x65)被视为不同字符。
- 精确匹配:适合需要严格区分大小写、重音的场景,例如:
- 存储密码哈希值(需精确比对)。
- 存储唯一标识符(如 API 密钥)。
- 场景示例:查询
WHERE username = 'User123'
时,不会匹配'user123'
。
(2)utf8mb4_general_ci
- 大小写不敏感(Case-Insensitive):
ci
即Case Insensitive
,查询时会忽略大小写。例如:'A'
和'a'
被视为相同字符。- 查询
WHERE name = 'apple'
会匹配'Apple'
、'APPLE'
等。
- 重音不敏感:忽略字母上的重音符号(如法语、西班牙语中的字符)。例如:
'é'
、'è'
、'e'
被视为相同字符。
- 通用排序:排序规则较简单,性能较好,但可能不符合某些语言的精细排序需求(如德语、法语的特殊排序规则)。
- 适用场景:常规文本查询,如用户名、文章标题、商品名称等,希望查询时不区分大小写和重音。
3. 选择建议
- 若需要精确匹配(如密码、唯一标识),或需区分大小写 / 重音,选择
utf8mb4_bin
。 - 若需模糊查询(如用户搜索、用户名登录不区分大小写),选择
utf8mb4_general_ci
。
补充说明
- 还有更精细的排序规则,如
utf8mb4_unicode_ci
,它遵循 Unicode 标准排序,支持更多语言的特殊排序规则,但性能略低于utf8mb4_general_ci
。 - 排序规则是针对字符集(如
utf8mb4
)的补充,utf8mb4
是 MySQL 中支持 Emoji 和所有 Unicode 字符的字符集,而排序规则决定了字符如何比较和排序。
创建数据库的时候,可以选择不同的编码,进行细分。