【发布时间】:2020-05-01 03:40:57
【问题描述】:
我有以下sn-p
select user_id into @selected_user from users where mail = 'mymail@gmail.com';
select * from kc_network_user where user_id = 'previous_id';
我想将其修改为参数化。我找到了以下资源:
- Using variables in SQL script
- How to declare a variable in MySQL?
- Declare variables - MySQL Workbench 给我一个错误 DECLARE
这就是我所做的:
select @user_mail := 'mymail@gmail.com'; #1
select @user_mail; #2
select user_id into @selected_user from user where mail = @user_mail; #3
select @selected_user;
select * from user_network where user_id = @selected_user; #4
在选择 #1 时,我还尝试了以下方法:
set @user_mail = 'mymail@gmail.com';
select #2 返回正确的值,因此变量被初始化。
选择#3 返回如下错误:
错误代码:1267。非法混合排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT) 操作'='
虽然选择 #4 运行正常(如果我使用文字值设置邮件参数)。
这些查询之间有什么区别? 如何在查询前设置变量?
【问题讨论】:
-
'MySQL Workbench 给我一个 DECLARE 错误' - 声明变量只能在存储程序(过程、函数、触发器、事件)中使用。
-
select #3 返回以下错误
mail排序规则由数据库、表或字段设置定义。@user_mail排序规则由您的连接设置定义(公平)。它们不同且不可强制,因此会产生错误。 -
但是您可以设置会话排序规则 - 请在此处查看来自 grid vost 的答案stackoverflow.com/questions/28540772/using-utf8mb4-in-mysql。顺便说一句,当它可以在 1 个查询中完成时,你这样做是有原因的。
-
谢谢,我想这就是我收到该错误的原因。我不明白如何在我的具体情况下应用它。