我目前在MySQL中有一个名为Admin_Emails的存储过程,它接受三个参数:siteID VARCHAR(20)categoryID INTapproved 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/

10-13 00:40