无法在Postgres插入中插入问号

7
我正在尝试运行一个简单的Postgres SQL插入操作:
insert into "Resources" values(1, 'How are you?');

但是插入后的结果是:
ID        Data
---       ------
1         How are you$1

我知道,如果要插入像单引号这样的特殊字符,我必须用另一个单引号进行转义,例如:我不能做到。

但是对于如何处理 < 和 > 字符呢?


你使用什么语言和库/框架来执行那个INSERT操作? - mu is too short
抱歉描述不完整,使用 NodeJS 和 Knex。 - Ashutosh
1
发现knex将?转换为$1,仍在进一步阅读该问题 :( - Ashutosh
1
不了解Knex,但PostgreSQL本身使用编号占位符($1$2,...),因此似乎Knex正在粗心地将所有问号替换为PostgreSQL风格的占位符。也许您应该在SQL中使用绑定参数而不是字符串字面量。 - mu is too short
看起来是 Knex 中的一个 bug。 - vitaly-t
@Ashutosh,你需要发布你使用的knex代码来生成SQL。否则,你的问题无法回答。 - vitaly-t
1个回答

10

Knex将??解释为位置绑定。您通常会在knex.raw()语句中使用它们,以安全地注入一些变量。例如:

knex.raw('UPDATE my_table SET my_column = ?', [someVariable])

对于原始语句,绑定参数通常是必要的,以确保您注入的任何内容都得到安全转义。

这就是为什么您会看到这种行为。好消息是,您可以仅转义问号。来自Knex.js文档

为了防止替换?,可以使用转义序列\\?。


所以,如果您的文本包含?,则knex需要进行额外的转义。这听起来一点也不正确或好。 - vitaly-t
2
@vitaly-t 不需要额外转义。您不应将值作为常量字符串传递给驱动程序,例如 knex.raw(select * from table where name = 'who are you?'),而是像这个答案所述的那样使用 knex.raw(select * from table where name = ?, ['who are you?']) 将值作为值绑定传递给数据库驱动程序。这仅仅是因为 knex 无法实现 SQL 解析器以便能够知道哪些部分是值,哪些不是。 - Mikael Lepistö
@Mi 我不同意你不能在常量字符串中传递 ? 的观点。这是一个原始查询,意味着我们已经在其他地方形成了它。例如,我们构建查询以作为存储过程调用传递。 - Mark Dornian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接