在 MySQL 中,字符集和排序规则决定了如何对字符进行比较和排序。utf8mb4_binutf8mb4_general_ci 是两种常用的排序规则,它们的主要区别在于是否区分大小写以及是否考虑字符的语言特性。下面通过详细案例来帮助你理解这两者的差异。


1. utf8mb4_bin 排序规则

utf8mb4_bin 是一种二进制排序规则,表示比较字符时是基于字符的二进制值进行逐位比较的,完全区分大小写,并且不会做任何的语言或文化特性转换。


特点:
  • 区分大小写:字符 'a' 和 'A' 会被认为是不同的字符。
  • 区分字符:例如,"apple" 和 "Apple"(全角字符)也会被认为不同。
示例:

假设我们有如下数据:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
);

INSERT INTO users (id, name) VALUES (1, 'apple'), (2, 'Apple'), (3, 'APPLE');

执行以下查询:

SELECT * FROM users WHERE name = 'apple';

结果:

id

name

1

apple

utf8mb4_bin 排序规则下,查询仅会匹配小写的 "apple",因为它严格区分大小写。


2. utf8mb4_general_ci 排序规则

utf8mb4_general_ci 是一种不区分大小写的排序规则,表示比较字符时会将大小写视为相同,并且会做一些简单的语言处理以适应不同的字符(如重音符号的忽略)。


特点:
  • 不区分大小写:字符 'a' 和 'A' 会被认为是相同的字符。
  • 忽略重音符号:例如,'é' 和 'e' 会被视为相同的字符。


示例:

继续使用之前的 users 表,如果执行以下查询:

SELECT * FROM users WHERE name = 'apple';

结果:

id

name

1

apple

2

Apple

3

APPLE

utf8mb4_general_ci 排序规则下,查询会匹配到小写的 "apple",大写的 "Apple""APPLE",因为它不区分大小写。


总结对比

特性

utf8mb4_bin

utf8mb4_general_ci

是否区分大小写

区分大小写 ('a' ≠ 'A')

不区分大小写 ('a' = 'A')

是否考虑字符的文化特性

不考虑(直接比较二进制值)

会忽略重音符号、大小写等语言差异

查询结果

精确匹配,大小写必须一致

大小写不敏感,字符会被统一处理

适用场景:

  • 如果你的应用对字符的大小写有严格要求,比如用户登录时输入用户名、密码等,需要精确匹配大小写,可以使用 utf8mb4_bin
  • 如果你希望用户输入时不区分大小写,或者对不同的语言字符做更宽松的处理,可以选择 utf8mb4_general_ci