在PostgreSQL中插入带单引号的文本

时间:2012-09-07 11:11:12

标签: postgresql insert special-characters quotes

我有一张表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转义机制?

8 个答案:

答案 0 :(得分:602)

通过加倍单引号' - > ''是标准方式,当然也有效。

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

在旧版本中,或者如果您仍然使用standard_conforming_strings = off运行,或者通常,如果您使用E添加字符串以声明 Posix转义字符串语法,您也可以转义使用反斜杠\

E'user\'s log'

但这通常不是优选的 如果你必须处理许多单引号或多层转义,你可以避免使用dollar-quoted strings在PostgreSQL中引用地狱:

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

为了进一步避免美元引号混淆,请为每对添加唯一标记:

$token$escape ' with ''$token$

可以嵌套任意数量的级别:

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

如果$字符在客户端软件中具有特殊含义,请注意。你可能不得不逃避它。对于像psql或pgAdmin这样的标准PostgreSQL客户端,情况并非如此。

这对于编写plpgsql函数或ad-hoc SQL命令非常有用。但是,当用户输入可用时,它无法减少使用预准备语句或其他方法来防止应用程序中的SQL注入的需要。 @Craig's answer有更多内容。更多细节:

答案 1 :(得分:43)

这是一个很糟糕的世界,因为你的问题暗示你的应用程序中可能存在漏洞SQL injection

您应该使用参数化语句。对于Java,请使用PreparedStatement with placeholders。你说你不想使用参数化语句,但是你没有解释为什么,坦率地说,它不是一个很好的理由不使用它们,因为它们是最简单,最安全的方式解决你想要解决的问题。

Preventing SQL Injection in Java。不要成为Bobby的下一个受害者。

PgJDBC中没有用于字符串引用和转义的公共函数。这部分是因为它可能会让它看起来像个好主意。

PostgreSQL中内置引用函数quote_literalquote_ident,但它们适用于使用PL/PgSQL的{​​{1}}函数。这些天EXECUTE大多被quote_literal淘汰,这是参数化版本,因为它更安全更容易。您不能将它们用于此处解释的目的,因为它们是服务器端功能。


想象一下,如果您从恶意用户那里获得值EXECUTE ... USING会发生什么。你会产生:

');DROP SCHEMA public;--

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

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

糟糕,有你的数据库。

答案 2 :(得分:17)

根据PostgreSQL documentation (4.1.2.1. String Constants)

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

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

答案 3 :(得分:7)

在postgresql中,如果你想在其中插入带有'的值,那么你必须提供额外的'

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

如果你需要在Pg中完成工作:

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE

答案 6 :(得分:-1)

select concat('''','abc','''')

答案 7 :(得分:-2)

<块引用>

SQL 中的字符串常量是由单引号 (') 包围的任意字符序列,例如 'This is a string'。要在字符串常量中包含单引号字符,请编写两个相邻的单引号,例如,'Dianne''s horse'。请注意,这与双引号字符 (") 不同。

https://www.postgresql.org/docs/9.4/sql-syntax-lexical.html