4

我有非常复杂的数据要插入到 postgresql 中,并使用双美元($$)来转义。但是,我有一排以美元符号结尾并导致错误。原始行就像'dd^d\w=dd$' 和转义时'$$dd^d\w=dd$$$'

我怎样才能逃避这个特定的行?

4

3 回答 3

7

使用双美元内的任何字符串来区分它:

select $anything$abc$$anything$;
 ?column? 
----------
 abc$

insert是类似的:

insert into t (a, b) values
($anything$abc$$anything$, $xyz$abc$$xyz$);
INSERT 0 1
select * from t;
  a   |  b   
------+------
 abc$ | abc$
于 2013-05-08T11:30:52.033 回答
3

虽然 Clodoaldo 是非常正确的,但我认为您需要查看另一个方面:

你为什么要自己引用?您通常应该通过您的编程语言的客户端驱动程序使用参数化(“准备好的”)语句。有关常用语言的一些示例,请参见bobby 表。使用参数化语句意味着您不再需要关心进行任何引用,它由数据库客户端驱动程序为您处理。

我会给你一个例子,但你没有提到你的客户端语言/工具。

于 2013-05-08T11:58:11.900 回答
2

我发现这个问题是从 linux shell 中用双美元文字执行查询的故障排除问题。例如select '$abc$',在 psql 中给出正确的结果$abc$,而psql -U me -c "select '$abc$'"从 linux shell 调用会产生不正确的结果$(前提是没有系统变量abc)。

在这种情况下,换行到另一个定界符 ( $wrapper$$abc$$wrapper$) 将无济于事,因为主要问题是在 shell 上下文中解释美元。可能的解决方案是转义美元(psql -U me -c "select '\$abc\$'"),但是当在 psql 中调用时,这会产生反斜杠。生成可在 psql 和 linux shell 中使用的相同查询psql -U me -c "select concat(chr(36),'abc',chr(36))"是通用解决方案。

于 2019-12-18T13:41:03.680 回答