MySQL 准备语句 nvarchar
MySQL prepared statement nvarchar
我有一个应该更新字段的准备好的语句。
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');
我明白了
Error 1054: Unknown column 'A' in 'field list'
能否请您协助解决问题?
编辑:我刚刚发现连字符不是错误的原因。如果我尝试使用 'AB' 进行更新,则会出现相同的错误。
要更新的字段也是nvarchar,字段长度相同。
基本上,您很容易受到 sql injection attacks 的攻击。您的存储过程生成了这个 sql:
UPDATE ... WHERE reg = A-B
请注意 A-B
周围缺少引号。您没有将字符串 A-B
存储在 reg
字段中。您正在进行数学减法:reg = A minus B
,A
和 B
都不是您的 table.
中存在的字段
您至少需要:
SET @sql = concat('UPDATE table SET ', col, ' = "', val , '" WHERE id = ', id);
^----------^
所以你正在生成
UPDATE ... reg = "A-B"
我有一个应该更新字段的准备好的语句。
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');
我明白了
Error 1054: Unknown column 'A' in 'field list'
能否请您协助解决问题?
编辑:我刚刚发现连字符不是错误的原因。如果我尝试使用 'AB' 进行更新,则会出现相同的错误。 要更新的字段也是nvarchar,字段长度相同。
基本上,您很容易受到 sql injection attacks 的攻击。您的存储过程生成了这个 sql:
UPDATE ... WHERE reg = A-B
请注意 A-B
周围缺少引号。您没有将字符串 A-B
存储在 reg
字段中。您正在进行数学减法:reg = A minus B
,A
和 B
都不是您的 table.
您至少需要:
SET @sql = concat('UPDATE table SET ', col, ' = "', val , '" WHERE id = ', id);
^----------^
所以你正在生成
UPDATE ... reg = "A-B"