Избегать обратной косой черты в Postgresql - PullRequest
5 голосов
/ 16 июня 2010

Я пытаюсь написать функцию sql в Postgresql, которая будет анализировать путь к файлу. Я хочу вернуть только имя файла.

Я не могу получить точную текстовую строку в функции.

Вот функция:

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 интерпретирует косую черту, за которой следуют определенные символы, как специальный символ.

Как мне сбежать?

Ответы [ 2 ]

7 голосов
/ 17 июня 2010

Вы должны использовать синтаксис escape-строки:

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
Функция

quote_literal должна использоваться только тогда, когда вы будете создавать запрос для вызова exec в функции pl / pgsql. Для построения запроса в клиенте вы должны использовать функцию цитирования клиентской библиотеки, например PQescapeStringConn в libpq или pg_escape_string в PHP. Но лучший вариант - использовать подготовленные операторы и использовать строку в качестве аргумента, что исключает все кавычки и также намного безопаснее .

0 голосов
/ 16 июня 2010

Вы должны экранировать \ с другим \

, т. Е. \\

. Вы можете отключить это поведение, установив параметр standard_conforming_strings в значение on.По умолчанию он выключен, но это значение по умолчанию изменится в будущем.

Я рекомендую пока двойную обратную косую черту.

...