小编典典

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

all

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


阅读 554

收藏
2022-03-06

共1个答案

小编典典

字符串文字

'通过将它们加倍来转义单引号->''是标准方式,当然也可以:

~~'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$

请注意该$字符在您的客户端软件中是否应具有特殊含义。此外,您可能还必须逃避它。对于像 psql 或 pgAdmin 这样的标准 PostgreSQL
客户端,情况并非如此。

这对于编写 plpgsql 函数或 ad-hoc SQL 命令非常有用。但是,当用户可以输入时,它不能减轻使用准备好的语句或其他方法来防止应用程序中的
SQL 注入的需要。@Craig
的回答
对此有更多了解。更多细节:

Postgres 中的值

在处理数据库中的值时,有几个有用的函数可以正确引用字符串:

2022-03-06