我正在尝试在Postgresql中编写一个解析文件路径的sql函数。 我想只返回文件名。
我无法在函数中获得准确的文本字符串。
这是功能:
Function: job_page("inputText" text)
DECLARE
$5 text;
BEGIN
$5 = quote_literal("inputText");
return $5;
END
当我运行时:
select job_page('\\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG')
我得到了这个结果:
"E'\\CAD_SVRCADJOBSé2-CEDARHURST ELEMENTARY SCHOOLé2-20.DWG'"
Postgresql解释斜杠后跟某些字符作为特殊字符。
我如何逃避?
答案 0 :(得分:7)
您应该使用转义字符串语法:
select E'\\CAD_SVR\\CADJOBS\\7512-CEDARHURST ELEMENTARY SCHOOL\\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG
无论如何都会有效。
或者你可以set standard_conforming_strings=on
并使用:
select '\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG
仅当您要在pl / pgsql函数中构造quote_literal
调用的查询时,才应使用 exec
函数。要在客户端构造查询,您应该使用客户端的库引用函数,如libpq中的PQescapeStringConn
或PHP中的pg_escape_string
。但最好的选择是使用预准备语句并使用字符串作为参数,这将消除所有引用,并且much safer也是。
答案 1 :(得分:0)
你必须用另一个\
来逃避\即。 \\
您可以通过将standard_conforming_strings选项设置为on来更改此行为。默认情况下它已关闭,但此默认值将在未来一段时间内更改。
我建议暂时使用双反斜杠。