gpt4 book ai didi

mysql - 为什么传递给存储过程的参数会导致 MySQL 错误 1267?

转载 作者:行者123 更新时间:2023-11-29 06:36:38 25 4
gpt4 key购买 nike

这两个存储过程都在我的 MySQL 5.1.73 服务器中编译:

delimiter $$
CREATE PROCEDURE get_admins()
BEGIN
SELECT *
FROM Accounts
INNER JOIN LINK_Account_Status ON Accounts.account_id=LINK_Account_Status.account_id
AND LINK_Account_Status.active_ind=1
WHERE Accounts.active_ind=1
AND Accounts.`type`='admin';
END $$
delimiter ;

delimiter $$
CREATE PROCEDURE get_admins2(
IN p_type varchar(50)
)
BEGIN
SELECT *
FROM Accounts
INNER JOIN LINK_Account_Status ON Accounts.account_id=LINK_Account_Status.account_id
AND LINK_Account_Status.active_ind=1
WHERE Accounts.active_ind=1
AND Accounts.`type`=p_type;
END $$
delimiter ;

执行 CALL get_admins(); 返回我期望的结果。

执行 CALL get_admins2('admin'); 错误:

Error Code: 1267. Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='

细心的响应者会注意到两个结果查询之间没有功能差异。我仔细检查过 Accounts.type 确实是一个 varchar(50)(即使它的名称很不幸)。

Sam Hill 中的内容这是怎么回事?

最佳答案

您需要在 WHERE 条件中使用 COLLATE 来解决这个问题,如下所示

delimiter $$
CREATE PROCEDURE get_admins2(
IN p_type varchar(50)
)
BEGIN
SELECT *
FROM Accounts
INNER JOIN LINK_Account_Status ON
Accounts.account_id=LINK_Account_Status.account_id
AND LINK_Account_Status.active_ind=1
WHERE Accounts.active_ind=1
AND Accounts.`type`=p_type COLLATE utf8_general_ci; /* <-- Here */
END $$
delimiter ;

您也可以在参数声明本身 ("As of [MySQL] 5.5.3, COLLATE can be used...") 中添加 COLLATION,例如:

delimiter $$
CREATE PROCEDURE get_admins2(
IN p_type varchar(50) COLLATE utf8_general_ci <-- Here

.....<rest of the code here>.....

编辑:

经过一些搜索后我发现,如果您的列具有不同的排序规则,即使表具有相同的排序规则,也可能会出现此问题。请参阅下面的 MySQL 论坛帖子

http://forums.mysql.com/read.php?103,265345,265579

关于mysql - 为什么传递给存储过程的参数会导致 MySQL 错误 1267?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com