我有准备好的声明,应该更新一个字段。

CREATE PROCEDURE `update_table` (in id INT, in col nvarchar(11), in val nvarchar(10))
BEGIN
SET @sql = concat('UPDATE table SET ', col, ' = ', val , ' WHERE id = ', id);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END


如果我使用包含连字符的字符串来调用该过程(例如A-B)


  呼叫update_table(1,'reg','A-B');


我懂了


  错误1054:“字段列表”中的未知列“ A”


您能协助解决问题吗?

编辑:我只是弄清楚连字符不是错误的原因。如果我尝试使用“ AB”进行更新,则会出现相同的错误。
要更新的字段也是nvarchar,具有相同的字段长度。

最佳答案

基本上,您很容易受到sql injection attacks的攻击。您的存储过程生成了此sql:

UPDATE ... WHERE reg = A-B


请注意A-B周围没有引号。您没有在A-B字段中存储字符串reg。您正在做数学减法:reg = A minus B,并且AB都不是表中存在的字段。

至少需要BARE,您需要:

SET @sql = concat('UPDATE table SET ', col, ' = "', val , '" WHERE id = ', id);
                                                ^----------^


所以你正在产生

UPDATE ... reg = "A-B"

关于mysql - MySQL准备好的语句nvarchar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39581308/

10-09 07:25