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/

相关文章:

mysql - mysql 排序规则为 utf8_unicode_ci 时的 sphinx 排序规则

java - 将一个整数从一个类传递到另一个类

mysql - 每个父级的内部连接限制

mysql - 包含列表中所有项目的 SQL 查询记录

MySQL存储过程不返回结果,IN参数返回NULL

mysql - 错误的字符串值 : '\xAE'

php - 注意 : Undefined index: userid in. .. PHP 不发送隐藏的输入 id

SQL Server INSERT … SELECT 语句无法解析

sql - 我想在 SQL Server 2008 中隐藏存储过程的脚本

sql-server - SQL Server 2008 数据库排序规则转换