SELECT COLLATION_NAME, PAD_ATTRIBUTE FROM INFORMATION_SCHEMA.COLLATIONS WHERE COLLATION_NAME IN ( 'utf8mb4_bin','utf8mb4_0900_bin', 'utf8mb4_general_ci','utf8mb4_0900_ai_ci' );
1 2 3 4 5 6 7 8
+----------------------+--------------+ | COLLATION_NAME | PAD_ATTRIBUTE| +----------------------+--------------+ | utf8mb4_0900_ai_ci | NO PAD | | utf8mb4_0900_bin | NO PAD | | utf8mb4_bin | PAD SPACE | | utf8mb4_general_ci | PAD SPACE | +----------------------+--------------+
方式二:查询当前会话使用的排序规则
1 2 3 4
SELECT @@collation_connectionAS current_collation, PAD_ATTRIBUTE FROM INFORMATION_SCHEMA.COLLATIONS WHERE COLLATION_NAME = @@collation_connection;
1 2 3 4 5
+------------------------+--------------+ | current_collation | PAD_ATTRIBUTE| +------------------------+--------------+ | utf8mb4_0900_ai_ci | NO PAD | +------------------------+--------------+
**扩展(expansion)**指一个字符在排序时被展开为多个字符参与比较。最典型的例子是德语 ß(eszett)。在 unicode_ci 排序规则中,ß 被展开为 ss(两个字符的权重),因此 ß 与 ss 在比较时等价:WHERE c = 'ß' 能匹配到 'ss'。而 general_ci 不支持扩展,ß 与 ss 各有独立权重,互不相等。
**收缩(contraction)**指多个字符在排序时被收缩为一个单元参与比较。典型场景是西班牙语中的 ch 和 ll。传统西班牙语排序中,ch 被视为独立字母,位于 c 和 d 之间;ll 位于 l 和 m 之间。unicode_ci 支持这种多字符收缩,general_ci 不支持。
中文和英文场景是否需要考虑: 扩展和收缩主要影响带变音符号的欧洲语言。中文和英文均不涉及变音符号或字符组合收缩——中文字符按 Unicode 码点或偏旁笔画排序,英文字母各自独立无组合规则。因此在这两个场景下,general_ci 和 unicode_ci 的排序结果完全一致,不需要特别关注扩展和收缩问题。选择 unicode_ci 主要是为了与多语言环境保持一致,以及获得 NO PAD 特性。
验证 —— 德语 ß 的处理:
1 2 3 4 5 6
CREATE TABLE g1 (c CHAR(10)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; INSERT INTO g1 VALUES ('ss'); SELECT*FROM g1 WHERE c ='ß'; INSERT INTO g1 VALUES ('ß'); SELECT*FROM g1 WHERE c ='ss';
1 2 3 4 5 6 7 8
+------+ | c | +------+ | ss | +------+ | ss | | ß | +------+
utf8mb4_unicode_ci 中 ß 与 ss 在比较时等价。
验证 —— 扩展与不扩展的权重对比:
1 2 3 4
SELECT HEX(WEIGHT_STRING('ß'COLLATE utf8mb4_unicode_ci)) AS unicode_ci_weight; SELECT HEX(WEIGHT_STRING('ss'COLLATE utf8mb4_unicode_ci)) AS ss_in_unicode_ci; SELECT HEX(WEIGHT_STRING('ß'COLLATE utf8mb4_general_ci)) AS general_ci_weight; SELECT HEX(WEIGHT_STRING('s'COLLATE utf8mb4_general_ci)) AS s_in_general_ci;
utf8mb4_unicode_ci 中 ß 与 ss 的权重完全相同(0FEA0FEA),说明 ß 被展开为 ss 两个字符参与排序——这就是扩展。utf8mb4_general_ci 中 ß 的权重仅为 0053(与 s 相同),不发生展开。
7.2 二进制排序规则
utf8mb4 有两个二进制排序规则:
utf8mb4_bin:基于码点值比较,PAD SPACE
utf8mb4_0900_bin:基于 UTF-8 编码字节比较,NO PAD,性能更好
九、连接字符集与排序规则
客户端与服务器通信时,涉及多个字符集相关的系统变量:
变量
作用
character_set_client
客户端发送 SQL 语句使用的字符集
character_set_connection
服务器解析字面量字符串时的字符集
character_set_results
服务器返回结果给客户端的字符集
collation_connection
字面量字符串比较时使用的排序规则
验证 —— 连接变量:
1 2 3 4 5
SELECT*FROM performance_schema.session_variables WHERE VARIABLE_NAME IN ( 'character_set_client','character_set_connection', 'character_set_results','collation_connection' );