我有非常复杂的数据,我正在插入postgresql并使用双元($$)
来逃避。但是我有一行以美元符号结束并导致错误。
原始行与'dd^d\w=dd$
'类似,并且在转义时'$$dd^d\w=dd$$$'
。
如何逃避此特定行?
答案 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))"
是通用解决方案。