指定utf8mb4_unicode_520_ci后,char类型CTE关联表为何出现排序规则冲突?
排序规则冲突原因解析
- CAST生成的CHAR字符串继承会话默认排序规则:你执行
CAST('apple' AS CHAR(255))时,生成的字符串排序规则并不会继承数据库的默认值(utf8mb4_unicode_520_ci),而是采用当前MySQL会话的默认排序规则。多数场景下会话默认是utf8mb4_general_ci(比如客户端连接默认配置、全局参数未修改),这就导致CTE中的字符串和test表字段的排序规则(utf8mb4_unicode_520_ci)不匹配,触发=操作的排序规则冲突报错。 - 去掉表COLLATION子句的隐式兼容逻辑:不给表指定COLLATION时,表字段会继承数据库的排序规则,此时MySQL会自动对会话默认排序规则的字符串做隐式转换,使其匹配表的排序规则,因此不会报错。
- NCHAR的规则匹配特性:MySQL中的NCHAR基于
character_set_national配置的字符集,默认会继承数据库的字符集和排序规则。你创建的数据库默认是utf8mb4_unicode_520_ci,所以CAST('apple' AS NCHAR(255))生成的字符串排序规则和表完全一致,不会出现冲突。
可选解决方法
- 显式指定CAST的排序规则:
CAST('apple' AS CHAR(255) CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_520_ci - 修改会话默认排序规则:执行
SET SESSION collation_connection = 'utf8mb4_unicode_520_ci';,让会话与数据库、表的排序规则保持一致
内容的提问来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

