在PostgreSQL中插入单引号文本

我有一张EYZ0号桌。

我需要插入如下值:user's log'my user'customer's

 insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');

我得到一个错误,如果我运行上述任何语句。

如果有任何正确的方法,请分享。我不想要任何事先准备好的声明。

是否可以使用sql转义机制?

595733 次浏览

根据PostgreSQL文档(4.1.2.1.;字符串常量):

要在字符串常量中包含单引号字符,请写入 两个相邻的单引号,例如:Dianne”年代马。< / p >

另请参阅standard_conforming_strings参数,该参数控制是否使用反斜杠进行转义。

这是非常糟糕的情况,因为您的问题暗示您的应用程序中可能存在SQL注入漏洞。

您应该使用参数化语句。对于Java,使用PreparedStatement与占位符。你说你不想使用参数化语句,但你没有解释为什么,坦率地说,这是一个很好的理由不使用它们,因为它们是解决你试图解决的问题的最简单、最安全的方法。

看到# EYZ0。不要成为鲍比的下一个受害者。

PgJDBC中没有用于字符串引用和转义的公共函数。这在一定程度上是因为它可能看起来是个好主意。

在PostgreSQL中有内置引号函数quote_literalquote_ident,但它们是用于使用EXECUTEPL/PgSQL函数。这些天quote_literal基本上被EXECUTE ... USING淘汰了,这是parameterised版本,因为它是更安全的更容易。您不能将它们用于这里解释的目的,因为它们是服务器端函数。


想象一下,如果从恶意用户获得值');DROP SCHEMA public;--会发生什么。你会产生:

insert into test values (1,'');DROP SCHEMA public;--');

它分解为两个语句和一个被忽略的注释:

insert into test values (1,'');
DROP SCHEMA public;
--');

哎呀,这就是你的数据库。

字符串字面值

转义单引号'→双引号→''是标准方法,当然有效:

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

注意,普通单引号(ASCII / UTF-8代码39)不是反引号`,它在Postgres中没有特殊用途(不像某些其他RDBMS),也不是双引号",用于标识符。

在旧版本中,或者如果你仍然使用standard_conforming_strings = off运行,或者通常情况下,如果你在字符串前面使用E来声明Posix转义字符串语法,你也可以使用反斜杠\进行转义:

E'user\'s log'

反斜杠本身用另一个反斜杠转义。但这通常是不可取的。
如果你必须处理很多单引号或多层转义,你可以在PostgreSQL中使用< >强dollar-quoted字符串< / >强:

来避免引用地狱
'escape '' with '''''
$$escape ' with ''$$

为了进一步避免美元报价之间的混淆,在每一对中添加一个唯一的令牌:

$token$escape ' with ''$token$

可以嵌套任意数量的层:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

注意$字符在客户端软件中是否具有特殊含义。此外,您可能还必须对其进行转义。这与标准的PostgreSQL客户端(如psql或pgAdmin)不同。

这对于编写plpgsql函数或特别SQL命令非常有用。但是,当可以使用用户输入时,它不能减少使用准备语句或其他方法来防止应用程序中的SQL注入的需要。@Craig的回答有更多相关内容。更多的细节:

Postgres中的值

当处理数据库中的值时,有几个有用的函数可以正确地引用字符串:

  • #EYZ0或quote_nullable() -后者输出字符串NULL作为空输入。
    还有quote_ident()双引号字符串需要获得有效的SQL 标识符.
  • format()与格式说明符%L等价于quote_nullable()
    李:# EYZ0 < / >
  • #EYZ0concat_ws()通常不适合这个目的,因为那些会转义嵌套的单引号和反斜杠。

在postgresql中,如果你想要插入带有'的值,那么你必须给出额外的'

 insert into test values (1,'user''s log');
insert into test values (2,'''my users''');
insert into test values (3,'customer''s');

你可以使用postrgesql chr(int)函数:

insert into test values (2,'|| chr(39)||'my users'||chr(39)||');

当我使用Python在PostgreSQL中插入值时,我也遇到了这个问题:column "xxx"不存在。

我在wiki.postgresql中找到了原因:

PostgreSQL只使用单引号(即WHERE name = 'John')。双引号用于引用系统标识符;字段名,表名,等等(例如WHERE "last name" = 'Smith').
MySQL使用`(重音标记或反标记)来引用系统标识符,这显然是非标准的

这意味着PostgreSQL只能对字段名、表名等使用单引号。所以你不能在值中使用单引号。

我的情况是:我想要插入值“它是对某人的adj和对某人的adj的区别”。到PostgreSQL。

我是如何解决这个问题的:

因为PostgreSQL的值不支持双引号。

所以我认为你可以使用以下代码来插入值:

 insert into test values (1,'user’s log');
insert into test values (2,'my users');
insert into test values (3,'customer’s');