在PostgreSQL中使用单引号插入文本。

21 浏览
0 Comments

在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 转义机制实现?

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

要在字符串常量中包含单引号字符,请写两个相邻的单引号,例如“Dianne''s horse”。

还可以参考standard_conforming_strings参数,该参数控制使用反斜杠转义是否有效。

0
0 Comments

字符串文字

通过将单引号'转义为双引号''是标准的方式,当然也是可行的:

'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()通常不适用于此目的,因为这些函数不会转义嵌套的单引号和反斜杠。
0