1

这两个存储过程都在我的 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');错误:

错误代码:1267。操作“=”的排序规则(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)的非法混合

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

山姆山这里发生了什么?

4

1 回答 1

4

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

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 ; 

您也可以在参数声明本身中添加 COLLATION(“从 [MySQL] 5.5.3 开始,可以使用 COLLATE ...”),例如:

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

于 2014-06-15T17:32:23.027 回答