MySQL:排序规则的非法混合:两个相同的排序规则

MySQL: Illegal mix of collations: both same collation

提问人:Manngo 提问时间:5/26/2023 更新时间:5/26/2023 访问量:131

问:

我在 SO 上看到许多关于类似问题的问题,但没有一个问题涉及这个特定的细节。

我使用这样的东西创建了一个数据库:

CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

我创建了一个具有相同字符集和排序规则的表:

DROP TABLE IF EXISTS test;
CREATE TABLE test (
    id int AUTO_INCREMENT PRIMARY KEY,
    data varchar(255)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci ENGINE=INNODB;
INSERT INTO test(data) VALUES ('apple'),('banana'),('cherry'),('date');

然后,我使用 CTE 加入表格:

WITH cte(name) AS (
    SELECT cast('apple' as char(255))
    UNION ALL SELECT cast('cherry' as char(255))
)
SELECT * FROM cte JOIN test on cte.name=test.data;

我收到以下错误:

操作“=”的排序规则 (utf8mb4_general_ci,IMPLICIT) 和 (utf8mb4_unicode_520_ci,IMPLICIT)
的非法混合。

问题是,数据库的默认排序规则与表的默认排序规则相同。

如果我创建的表末尾没有排序规则子句,那就没问题了。如果我使用代替 .ncharchar

我知道,为什么我不直接创建没有排序规则子句的表,或者使用 ?问题是,如果我指定排序规则,为什么它不起作用?ncharchar

MySQL MariaDB 归类 UTF8MB4

评论


答:

4赞 Bill Karwin 5/26/2023 #1

你的桌子很好。

是会话排序规则不兼容。

演示,使用您的示例表和数据:

mysql> WITH cte(name) AS (
    ->     SELECT cast('apple' as char(255))
    ->     UNION ALL SELECT cast('cherry' as char(255))
    -> )
    -> SELECT * FROM cte JOIN test on cte.name=test.data;
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_520_ci,IMPLICIT) for operation '='

这就是你得到的错误,因为我的会话排序规则是utf8mb4_0900_ai_ci。

我可以更改会话排序规则并再次测试:

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;

mysql> WITH cte(name) AS (
    ->     SELECT cast('apple' as char(255))
    ->     UNION ALL SELECT cast('cherry' as char(255))
    -> )
    -> SELECT * FROM cte JOIN test on cte.name=test.data;
+--------+----+--------+
| name   | id | data   |
+--------+----+--------+
| apple  |  1 | apple  |
| cherry |  3 | cherry |
+--------+----+--------+

评论

1赞 Manngo 5/26/2023
为什么哦,为什么它必须如此违反直觉?谢谢你的回答。