代码之家  ›  专栏  ›  技术社区  ›  Manngo

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

  •  0
  • Manngo  · 技术社区  · 1 年前

    我在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)和(utf8m b4_unicode_520_ci,IMPLICIT)
    用于操作“=”。

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

    如果我创建的表末尾没有排序规则子句,那就好了。如果我使用 nchar 而不是 char

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

    1 回复  |  直到 1 年前
        1
  •  4
  •   Bill Karwin    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 |
    +--------+----+--------+