在PostgreSQL中用单引号插入文本

我有一个表test(id,name)

我需要插入的值如: 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转义机制?

通过翻倍单引号' ''是当然的标准方式和作品。

 'user's log' 'user''s log' 

在旧版本中,或者仍然使用standard_conforming_strings = off运行,或者通常,如果用E预先声明string以声明Posix转义string语法 ,则也可以使用反斜杠\

 E'user\'s log' 

但这通常不是可取的。
如果你必须处理很多单引号或者多层转义,你可以避免在PostgreSQL中用美元引用的string引用地狱:

 'escape '' with ''''' $$escape ' with ''$$ 

为了进一步避免美元报价中的混淆,请在您的美元报价中添加或多或less的独特标记:

 $token$escape ' with ''$token$ 

它可以嵌套任何级别:

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

请注意,如果$字符在客户端软件中应该有特殊含义。 你可能不得不逃脱它。 标准的PostgreSQL客户端,例如psql或pgAdmin,情况并非如此。

这对编写plpgsql函数或ad-hoc SQL命令非常有用。 尽pipe如此,它不能缓解使用预处理语句或其他方法防止SQL注入的需要。 @克雷格的答案有更多的。 更多细节:

  • Postgres函数与准备查询中的SQL注入

这是如此之多的糟糕的世界,因为你的问题意味着你可能在你的应用程序中有很大的SQL注入漏洞。

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

请参阅防止Java中的SQL注入 。 不要成为鲍比的下一个受害者。

PgJDBC没有公共职能来进行string引用和转义。 这部分是因为它可能使它看起来像一个好主意。

PostgreSQL中有内置的引用函数quote_literalquote_ident ,但是它们是使用EXECUTE PL/PgSQL函数。 现在, quote_literal大部分已经被EXECUTE ... USING废弃,这是参数化的版本 ,因为它更安全更简单 。 你不能将它们用于你在这里解释的目的,因为它们是服务器端的function。


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

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

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

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

哎呀,那里有你的数据库。

根据PostgreSQL文档(4.1.2.1。string常量) :

  To include a single-quote character within a string constant, write two adjacent single quotes, eg 'Dianne''s horse'. 

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

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

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