Я пытаюсь записать функцию 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 интерпретирует наклонную черту, сопровождаемую определенными символами как специальный символ.
Как я выхожу?
Вы должны использовать синтаксис escape string:
select E'\\CAD_SVR\\CADJOBS\\7512-CEDARHURST ELEMENTARY SCHOOL\\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG
Это будет работать в любом случае.
Или вы можете установить 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. Но лучший вариант - использовать подготовленные операторы и использовать строку в качестве аргумента, что исключает все кавычки и гораздо безопаснее.
Вы должны выйти из \ с другим \
т.е. \\
Вы можете отключить это поведение, включив параметр standard_conforming_strings. По умолчанию он выключен, но в будущем это значение по умолчанию изменится.
Я пока рекомендую использовать двойную обратную косую черту.