在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注入的需要。 @克雷格的答案有更多。 更多细节:
这是如此之多的糟糕的世界,因为你的问题意味着你的应用程序中可能存在空洞的SQL注入漏洞。
你应该使用参数化语句。 对于Java,使用带占位符的PreparedStatement
。 你说你不想使用参数化语句,但是你不解释原因,坦率地说它不应该是一个很好的理由不使用它们,因为它们是解决你试图解决问题的最简单,最安全的方法解决。
请参阅在Java中防止SQL注入。 不要成为博比的下一个受害者。
PgJDBC没有公共职能用于字符串引用和转义。 部分原因是它可能使它看起来像一个好主意。
PostgreSQL中有内置的引用函数quote_literal
和quote_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