[英]Why does ODBC C# return empty string while using OUT parameter in Stored Procedure in MySQL?
[英]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 論壇帖子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.