MYSQL中的会话变量名被逐字复制到CONCAT语句中(而不是它的值)
我有一个触发器,它可以将一个条目插入到我的notifications表中,效果非常好。但是,我需要在通知字符串(用户名)中添加一段额外的数据,在插入之前通过选择获取该字符串。我将值放在变量@user_name中,但当我查看表通知中的输出字符串(消息)时,我看到的是我的变量名,即“…@user_name…”而不是该变量的内容 我完全不知道发生了什么,因为CONCAT()的其他参数,例如NEW.APPID,显然正在被解析。为什么我的@user\u name变量没有被解析?我试着把它改成用户名,同样的事情也发生了MYSQL中的会话变量名被逐字复制到CONCAT语句中(而不是它的值),mysql,sql,variables,triggers,Mysql,Sql,Variables,Triggers,我有一个触发器,它可以将一个条目插入到我的notifications表中,效果非常好。但是,我需要在通知字符串(用户名)中添加一段额外的数据,在插入之前通过选择获取该字符串。我将值放在变量@user_name中,但当我查看表通知中的输出字符串(消息)时,我看到的是我的变量名,即“…@user_name…”而不是该变量的内容 我完全不知道发生了什么,因为CONCAT()的其他参数,例如NEW.APPID,显然正在被解析。为什么我的@user\u name变量没有被解析?我试着把它改成用户名,同样的
delimiter //
CREATE TRIGGER crashes_trigger
AFTER INSERT ON CRASHES
FOR EACH ROW
BEGIN
SELECT NAME INTO @user_name FROM USER,DEVICE WHERE USER.USERID=DEVICE.USERID AND DEVICE.DEVICEID=NEW.DEVICEID;
INSERT INTO NOTIFICATIONS (TABLENAME, ID, MESSAGE) VALUES ("C1", "1", CONCAT("crash (AppID = ",NEW.APPID,", UserID = “,@user_name,”, DID = ",NEW.DID,", Reason = '", NEW.REASON,"', AV = ", NEW.AV,")"));
END;//
delimiter ;
我用触发器外的变量做了一个简单的测试,它按设计工作。为什么我的扳机不同
mysql> set @test := "hi";
Query OK, 0 rows affected (0.00 sec)
mysql> select concat("(", @test, ")");
+-------------------------+
| concat("(", @test, ")") |
+-------------------------+
| (hi) |
+-------------------------+
1 row in set (0.00 sec)
多亏了一个有帮助的回答,我被告知我的引语有误。我修正了这一点,下面是已更改的部分:
INSERT INTO NOTIFICATIONS (TABLENAME, ID, MESSAGE) VALUES ("CRASHES", "1", CONCAT("crashed (AppID = ",NEW.APPID,", UserID = ",@user_name,", DID = ",NEW.DID,", Reason = '", NEW.REASON,"', AV = ", NEW.AV,")"));
这是你的意图吗
INSERT INTO NOTIFICATIONS (TABLENAME, ID, MESSAGE)
VALUES ("C1", "1",
CONCAT("crash (AppID = ",NEW.APPID,", UserID = “,", @user_name, ",”, DID = ",NEW.DID,", Reason = '", NEW.REASON,"', AV = ", NEW.AV,")"
)
);
MySQL不在字符串中进行变量替换
编辑:
字符串的问题实际上是有“
而不是”
。也就是说,用卷曲引号而不是“直”引号。我想这就是你真正的意思:
CONCAT("crash (AppID = ",NEW.APPID,", UserID = ", @user_name, ", DID = ",NEW.DID,", Reason = '", NEW.REASON,"', AV = ", NEW.AV,")"
)
当您从其他应用程序(如Word)复制插入卷引号的应用程序时,可能会发生这种情况。是的,这是我的插入操作。如果您查看我文章中的最后一个测试查询,您将看到它在字符串中执行变量子语句。如果这两个用例之间存在一些差异,我如何完成我需要的操作?@Locksleyu…No.in测试查询,
@test
是concat()
(非常好)的参数。在insert
查询中,@user\u name
位于双引号之间。戈登,非常感谢你指出这一点。我修复了双引号(请参阅我对原始帖子的更新),但现在我得到了一个空字符串结果。我将继续尝试,因为这似乎是另一个问题,但如果您发现我的查询有任何其他错误,请告诉我。@Locksleyu…concat()
返回NULL
如果任何参数为NULL
。将所有变量参数包装在coalesce()中
,类似于coalesce(@user\u name,”)
。我刚刚在测试数据中发现了另一个错误,当我修复该错误时,@user\u name不为空,并且一切正常。谢谢!!!