在Postgresql中转义反斜杠

moh*_*ton 6 postgresql escaping slash filepath

我正在尝试在Postgresql中编写一个解析文件路径的sql函数.我想只返回文件名.

我无法在函数中获得准确的文本字符串.

这是功能:

Function:  job_page("inputText" text)
DECLARE
    $5 text;

BEGIN
    $5 = quote_literal("inputText");
    return $5;
END
Run Code Online (Sandbox Code Playgroud)

当我运行这个:

select job_page('\\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG')
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

"E'\\CAD_SVRCADJOBSé2-CEDARHURST ELEMENTARY SCHOOLé2-20.DWG'"
Run Code Online (Sandbox Code Playgroud)

Postgresql解释斜杠后跟某些字符作为特殊字符.

我怎么逃避?

Tom*_*zky 8

您应该使用转义字符串语法:

select E'\\CAD_SVR\\CADJOBS\\7512-CEDARHURST ELEMENTARY SCHOOL\\7512-20.DWG';

\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG
Run Code Online (Sandbox Code Playgroud)

这无论如何都适用.

或者您可以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
Run Code Online (Sandbox Code Playgroud)

quote_literal只有exec在pl/pgsql函数中构建调用查询时才应使用该函数.要在客户端构造查询,您应该使用客户端的库引用函数,如PQescapeStringConnlibpq或pg_escape_stringPHP.但最好的选择是使用预准备语句并使用字符串作为参数,这样可以消除所有引用并且更加安全.