我有一张表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转义机制?
答案 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_literal
和quote_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'。请注意,这与双引号字符 (") 不同。