MySQL编写的语句nvarchar

时间:2016-09-19 20:12:03

标签: mysql sql mysql-error-1054

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

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)调用该过程

  

CALL update_table(1,' reg',' A-B');

我得到了

  

错误1054:未知列' A'在'字段列表'

你能协助解决这个问题吗?

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

1 个答案:

答案 0 :(得分:4)

基本上你很容易受到sql injection attacks的攻击。你的sproc生成了这个sql:

UPDATE ... WHERE reg = A-B

请注意A-B周围缺少引号。您未将字符串A-B存储在reg字段中。您正在进行数学减法:reg = A minus BAB都不是您表格中存在的字段。

至少BARE需要:

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

所以你要生成

UPDATE ... reg = "A-B"