我目前在MySQL中有一个名为Admin_Emails
的存储过程,它接受三个参数:siteID VARCHAR(20)
categoryID INT
approved INT
siteID
始终采用以下格式:s-xxx(x)-xxxxxx
。
在过程中,我使用以下命令将siteID
添加到查询中:
IF(siteID IS NOT NULL)
THEN
SET @query = CONCAT(@query, " AND e.site_id = ", siteID);
END IF;
如果我运行该过程(例如
CALL Admin_Emails('s-osp-123ABC', 2, 1)
,则会得到以下错误:#1054 - Unknown column 's' in 'where clause'
s
来自siteID
字符串。我试图将CONCAT
语句修改为以下内容:SET @query = CONCAT(@query, " AND e.site_id = ", "'" + siteID + "'");
它不会产生错误,但会给出与输入不匹配的
siteID's
结果。我故意在查询中排除AND
而产生了一个错误,它显示了一个0
,其中siteID
应该是:#1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'e.site_id = 0 AND e.category_id = 2 AND e.is_approved != 0' at line 20
我不知所措。我尝试过在存储过程中搜索与
VARCHAR
字符串相关的问题,但找不到类似的情况。有人知道我做错了什么吗?我不想让整个过程负担过重,所以我希望我在这里提供的足够了,但如果不是,我可以生产更多的我的程序。
最佳答案
为什么不
CONCAT(@query, " AND e.site_id = ", "'", siteID,"'");
当concat()支持字符串concat的n个值时尝试
+
似乎很奇怪。。。我认为++试图做数学运算,结果导致了错误。
或者您在查询的末尾有一个
or
限制,并且添加了and。。。。如果or没有正确的(),则可能导致意外结果的问题。请注意,如果传入的SiteID未被正确清理,您现在就有了SQL注入的可能性。
关于mysql - 为什么我的存储过程无法识别我的varchar字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44027818/