在PostgreSQL中使用单引号插入文本。
在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 转义机制实现?
根据PostgreSQL文档(4.1.2.1.字符串常量):
要在字符串常量中包含单引号字符,请写两个相邻的单引号,例如“Dianne''s horse”。
还可以参考standard_conforming_strings
参数,该参数控制使用反斜杠转义是否有效。
字符串文字
通过将单引号'
转义为双引号''
是标准的方式,当然也是可行的:
'user's log'-- incorrect syntax (unbalanced quote) 'user''s log'
仅仅是单引号(ASCII / UTF-8代码39),请注意,不是反引号`
,在Postgres中(与某些其他RDBMS不同)没有特殊的用途,也不是双引号"
,用于标识符。
在旧版本中,或者如果您仍然运行standard_conforming_strings = off
,或者通常如果您在字符串前面添加E
来声明Posix逃逸字符串语法,您也可以使用反斜杠\
进行转义:
E'user\'s log'
反斜杠本身是用另一个反斜杠转义的。但通常不是首选方案。
如果您必须处理许多单引号或多个转义层级,则可以使用美元引用字符串避免在PostgreSQL中出现引用地狱:
'escape '' with ''''' $$escape ' with ''$$
为了进一步避免美元引用之间的混淆,可以为每对添加一个唯一的标记:
$token$escape ' with ''$token$
可以嵌套任意层数:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
注意,如果$
字符在您的客户端软件中具有特殊含义,则需要进行转义。您可能还需要进行转义以防止SQL注入。 当用户输入可能时,这并不能缓解使用预处理语句或其他方法来保护应用程序的需要。 使用PL / pgSQL函数或特定于应用程序的SQL命令非常有用。 更多细节:
Postgres内部值
在处理数据库内的值时,有几个有用的函数可以正确引用字符串:
quote_literal()
或quote_nullable()
- 后者输出未引用的字符串NULL
作为null输入。
还有quote_ident()
用于双引号引用字符串以获取有效的SQL标识符。format()
带有格式说明符%L
相当于quote_nullable()
。
例如:format('%L', string_var)
或concat()
通常不适用于此目的,因为这些函数不会转义嵌套的单引号和反斜杠。concat_ws()