我有非常复杂的数据要插入到 postgresql 中,并使用双美元($$)
来转义。但是,我有一排以美元符号结尾并导致错误。原始行就像'dd^d\w=dd$
' 和转义时'$$dd^d\w=dd$$$'
。
我怎样才能逃避这个特定的行?
我有非常复杂的数据要插入到 postgresql 中,并使用双美元($$)
来转义。但是,我有一排以美元符号结尾并导致错误。原始行就像'dd^d\w=dd$
' 和转义时'$$dd^d\w=dd$$$'
。
我怎样才能逃避这个特定的行?
使用双美元内的任何字符串来区分它:
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$
虽然 Clodoaldo 是非常正确的,但我认为您需要查看另一个方面:
你为什么要自己引用?您通常应该通过您的编程语言的客户端驱动程序使用参数化(“准备好的”)语句。有关常用语言的一些示例,请参见bobby 表。使用参数化语句意味着您不再需要关心进行任何引用,它由数据库客户端驱动程序为您处理。
我会给你一个例子,但你没有提到你的客户端语言/工具。
我发现这个问题是从 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))"
是通用解决方案。