1
這些存儲過程都編譯我的MySQL服務器73年5月1日:爲什麼傳入存儲過程的參數會導致MySQL錯誤1267?
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,隱含的)操作 '='
細心的響應將注意兩個結果查詢之間沒有功能差異。我仔細檢查了Accounts.type
確實是varchar(50)
(即使它不幸命名)。
Sam Hill在這裏發生了什麼?
「參數類型和函數返回類型可以聲明爲使用任何有效的數據類型,不同的是COLLATE屬性不能使用。」 http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html –
@JeromyFrench,是;我錯過了你正在使用5.1。*。然後你可以在'WHERE'條件下使用它,但是在MySQL 5.6或更高版本中,你可以在參數聲明中使用'collate';就像你已經編輯過的一樣。是的,謝謝你。 – Rahul
謝謝你指點我在正確的方向。 –