Postgresql逃脱美元符号

时间:2013-05-08 11:26:59

标签: postgresql

我有非常复杂的数据,我正在插入postgresql并使用双元($$)来逃避。但是我有一行以美元符号结束并导致错误。 原始行与'dd^d\w=dd$'类似,并且在转义时'$$dd^d\w=dd$$$'

如何逃避此特定行?

3 个答案:

答案 0 :(得分:6)

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

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$

答案 1 :(得分:3)

虽然Clodoaldo非常正确,但我认为还有另外一个方面需要关注:

你为什么自己做报价?您通常应该通过编程语言的客户端驱动程序使用参数化(“准备好”)语句。有关常用语言的一些示例,请参阅bobby tables。使用参数化语句意味着您不必再关心进行任何引用了,数据库客户端驱动程序会为您提供帮助。

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

答案 2 :(得分:0)

我发现了这个问题疑难解答问题,它是在Linux shell中用双精度字面值执行查询。例如,psql中的select '$abc$'会给出正确的结果$abc$,而从Linux shell调用的psql -U me -c "select '$abc$'"会产生错误的结果$(假设没有系统变量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))"是通用解决方案。