在我的删除服务器上执行 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/
collation_connection utf8_unicode_ci
collation_database utf8_general_ci
collation_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/