在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预先声明字符串以声明Posix转义字符串语法,则也可以使用反斜杠

E'user's log'

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

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

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

$token$escape ' with ''$token$

它可以嵌套任何级别:

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

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

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

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

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

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

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

    PgJDBC没有公共职能用于字符串引用和转义。 部分原因是它可能使它看起来像一个好主意。

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


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

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

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

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

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


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

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

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

    链接地址: http://www.djcxy.com/p/93647.html

    上一篇: Insert text with single quotes in PostgreSQL

    下一篇: When to use single quotes, double quotes, and back ticks in MySQL