簡體   English   中英

為什么傳遞給存儲過程的參數會導致 MySQL 錯誤 1267?

[英]why does a parameter passed into a stored procedure cause MySQL error 1267?

這兩個存儲過程都在我的 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確實是一個varchar(50) (即使它被不幸地命名了)。

山姆山這里發生了什么?

您需要在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 ; 

您也可以在參數聲明本身中添加 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM