MYSQL中的会话变量名被逐字复制到CONCAT语句中(而不是它的值)

MYSQL中的会话变量名被逐字复制到CONCAT语句中(而不是它的值),mysql,sql,variables,triggers,Mysql,Sql,Variables,Triggers,我有一个触发器,它可以将一个条目插入到我的notifications表中,效果非常好。但是,我需要在通知字符串(用户名)中添加一段额外的数据,在插入之前通过选择获取该字符串。我将值放在变量@user_name中,但当我查看表通知中的输出字符串(消息)时,我看到的是我的变量名,即“…@user_name…”而不是该变量的内容 我完全不知道发生了什么,因为CONCAT()的其他参数,例如NEW.APPID,显然正在被解析。为什么我的@user\u name变量没有被解析?我试着把它改成用户名,同样的

我有一个触发器,它可以将一个条目插入到我的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不为空,并且一切正常。谢谢!!!