【问题标题】:Cannot insert question mark in postgres insert无法在 postgres insert 中插入问号
【发布时间】:2018-03-04 16:40:25
【问题描述】:

我正在尝试运行一个简单的 Postgres SQL 插入:

insert into "Resources" values(1, 'How are you?');

但是插入后的结果是:

ID        Data
---       ------
1         How are you$1

我知道,要插入像单引号这样的字符,我必须用另一个单引号来转义它,例如:I can't do it.

但是怎么办呢?

【问题讨论】:

  • 您使用什么语言和库/框架来执行插入?
  • 抱歉描述不完整,使用NodeJS和Knex
  • 发现 knex 正在转换?到 1 美元,仍在阅读更多关于此的内容:(
  • 不知道 Knex,但 PostgreSQL 本身就使用编号占位符($1$2、...),因此 Knex 似乎草率地将所有问号替换为 PostgreSQL 样式的占位符。也许您应该在 SQL 中使用绑定参数而不是字符串文字。
  • 看起来像 knex 中的一个错误。

标签: node.js postgresql knex.js


【解决方案1】:

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

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

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

这就是您看到这种行为的原因。好消息是,您可以避开问号。来自Knex.js documentation

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

【讨论】:

  • 因此 knex 需要额外转义以防止您的文本包含 ?。这听起来一点也不对或不好。
  • @vitaly-t 它不需要额外的转义。您不应该将值作为常量字符串传递给像 knex.raw(select * from table where name = 'who are you?') 这样的驱动程序,但是正如这个答案所述,您应该执行 knex.raw(select * from table where name = ?, ['who are you?']) 将值作为值传递绑定到数据库驱动程序。这仅仅是因为 knex 无法实现 SQL 解析器来知道哪些部分是值,哪些不是。
  • @Mi 我不同意你应该不能通过?在一个常量字符串中。这是一个原始查询,意味着我们已经在其他地方形成了它。例如,我们构建要作为存储过程调用传递的查询。
猜你喜欢
  • 2019-10-01
  • 2022-07-24
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2016-03-11
  • 2014-02-10
相关资源
最近更新 更多