mysql - 如何修复 "Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation ' ='"

标签 mysql stored-procedures collation

在我的删除服务器上执行 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";

Screenshot of tables from phpMyAdmin

此表 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

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

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

最佳答案

执行显示创建过程SetNextPage\G

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

更改连接的排序规则,或者删除过程、设置名称,然后重新创建过程。

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

可以更改连接的SESSION变量。

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

要更改过程,请DROP它,SET NAMES utf8 COLLATE utf8_unicode_520_ci;重新CREATE它。

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

关于mysql - 如何修复 "Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation ' ='",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472631/

相关文章:

php - 在 PHP 中回显 SQL 字段

php - 仅使用 PHP/HTML/Javascript 将 'value' 从多个单选类型选择添加到 mySQL 中的特定行/列

mysql - 存储过程中出现意外的逗号

mysql - 将 utf-8 数据从 mysql 迁移到 SQL Server 2005

mysql编码加密文本

php - 使用 SQL 和 PHP 从不同表中搜索数据

stored-procedures - Firebird 和存储过程 : if exists then else

MySQL 过程检查记录是否在插入不工作之前存在

ios - UILocalizedIndexedCollat​​ion 只返回英文排序规则

php循环记录集直到