MySQL 准备语句 nvarchar

标签 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');

我明白了

Error 1054: Unknown column 'A' in 'field list'

能否请您协助解决问题?

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

最佳答案

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

UPDATE ... WHERE reg = A-B

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

您至少需要:

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

所以你正在生成

UPDATE ... reg = "A-B"

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

相关文章:

php - 如何从mysql表中获取分数总和

sql - 根据另一个表更新行

php - 带有 ExtJS 的基于 php 的搜索工具在 Windows 环境下运行不佳

mysql - SQL语句错误

mysql - 数据库设计选择 : Order Belongs To Invoice Or Invoice Belongs To a Order

javascript - 使用 select 语句到数据库表禁用日期选择器中的日期

php - Laravel - 如何使用查询生成器或 Eloquent 添加 JOIN 和 CASE-WHEN?

python - python-mysql游标: 1054 unknown column "x" in 'field list' 报错信息

mysql - SELECT COLUMN_NAMES 是其他表中的值 (mysql)

mysql - 允许的内存大小在非 PHP MySQL 导入期间耗尽