【问题标题】:How to fix "Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='"如何修复“用于操作'='的排序规则(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)的非法混合”
【发布时间】:2020-04-15 18:20:26
【问题描述】:

在我的删除服务器上执行 MySQL 中的存储过程时,如下所示:

CREATE OR REPLACE PROCEDURE `SetNextPage`(
    IN `inRefNo` varchar(30) COLLATE utf8_general_ci,
    IN `inStage` varchar(40) COLLATE utf8_general_ci,
    IN `inRedirectTo` varchar(50) COLLATE utf8_general_ci,
    IN `inSurveyType` varchar(14) COLLATE utf8_general_ci
)
BEGIN
    IF inSurveyType = 'preinspection' THEN
        UPDATE preinspections SET Stage = inStage, RedirectTo = inRedirectTo WHERE RefNo = inRefNo;
    ELSE
        UPDATE surveys SET Stage = inStage, RedirectTo = inRedirectTo WHERE RefNo = inRefNo;
    END IF;
END

我收到如下错误消息:

用于操作“=”的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

这是我的数据库中的表的屏幕截图,查询如下:

SELECT TABLE_NAME, TABLE_COLLATION
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="mydatabase" AND TABLE_TYPE="BASE TABLE";

这个表 quick_tables.bck 只是卡在那里,因为它的名称中有 .bck。但它不在我的代码中。

下面是带有 SQL 查询的系统变量的快照,如下所示:

SHOW VARIABLES WHERE Variable_name LIKE ("character%") OR Variable_name LIKE ("Collation%");

变量名
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem 二进制
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
collat​​ion_connection utf8_unicode_ci
collat​​ion_database utf8_general_ci
collat​​ion_server latin1_swedish_ci

在使用共享主机的远程服务器上,我无法更改环境变量。

我应该进行哪些更改以使我的存储过程能够运行?

【问题讨论】:

    标签: mysql stored-procedures collation


    【解决方案1】:

    SHOW CREATE PROCEDURE SetNextPage \G

    您可能会发现在定义 proc 时生效的字符集和/或排序规则不是您现在想要的。

    要么更改连接的排序规则,要么删除 proc,SET NAMES,然后重新创建 proc。

    对于一般用途,utf8_genera_ci 最不“好”,其次是 utf8_unicode_ci,然后是 utf8_unicode_520_ci。当您使用 MySQL 8.0 时,会有更好的选择。

    可以为您的连接更改SESSION变量。

    由于 Proc 和连接中的设置存在差异,因此需要更改其中的一个或另一个。

    要更改 proc,DROP it,SET NAMES utf8 COLLATE utf8_unicode_520_ci; re-CREATE it。

    要更改连接,请查看 API 在连接中提供的内容。或者像上面那样做一个 SET。

    【讨论】:

    • 抱歉回复晚了。我已经完成了SHOW CREATE PROCEDURE SetNextPage。这是所需的输出为 [key: value pairs] - [Procedure: SetNextPage], [character_set_client: utf8mb4], [collat​​ion_connection: utf8mb4_general_ci ],[数据库排序规则:latin1_general_ci] 在托管服务器上。 collat​​ion_connection 的值与查询SHOW VARIABLES WHERE Variable_name LIKE ("character%") 给出的值不同,如上所示。这有什么问题吗?如果是,在哪里以及如何解决?
    • 我的托管公司在尝试修复数据库连接和表格中的排序规则时阻止了我的托管帐户:(。
    • 更改连接排序规则和其他排序规则有效。
    【解决方案2】:

    MySQL 中的以下脚本对我有用,而且很可能适用于所有人。

    /* Set collations of system variables */
    SET @@collation_connection = UTF8MB4_GENERAL_CI;
    SET @@collation_database = UTF8MB4_GENERAL_CI;
    SET @@collation_server = UTF8MB4_GENERAL_CI;
    
    /* Set collations of database tables */
    ALTER TABLE table1 COLLATE utf8mb4_general_ci;
    ALTER TABLE table2 COLLATE utf8mb4_general_ci;
    and so on...
    

    还将所有符合条件的变量的 CHARACTER SET 更改/设置为 utf8mb4,就像我在脚本中所做的那样:

    CREATE OR REPLACE PROCEDURE `SetNextPage`(
    IN `inRefNo` varchar(30) CHARSET utf8mb4,
    IN `inStage` varchar(40) CHARSET utf8mb4,
    .....
    

    您可以选择任何您喜欢的排序规则和相应的字符集,但它们应该在曾经使用过的地方匹配。

    如果事情可能以某种方式使用不同的排序规则/字符集,我不知道。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2012-07-30
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2023-03-21
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多