我有准备好的声明,应该更新一个字段。
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
,并且A
和B
都不是表中存在的字段。至少需要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/