Escapar barra invertida en PostgreSQL
-
27-09-2019 - |
Pregunta
Estoy intentando escribir una función de SQL en PostgreSQL que analizar una ruta de archivo. Quiero devolver sólo el nombre del archivo.
No se puede conseguir más allá de conseguir una cadena de texto exacta en la función.
Esta es la función:
Function: job_page("inputText" text)
DECLARE
$5 text;
BEGIN
$5 = quote_literal("inputText");
return $5;
END
Cuando ejecuto esto:
select job_page('\\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG')
Me conseguir este resultado:
"E'\\CAD_SVRCADJOBSé2-CEDARHURST ELEMENTARY SCHOOLé2-20.DWG'"
PostgreSQL interpreta la barra seguida por ciertos caracteres como un carácter especial.
¿Cómo me escape?
Solución
Se debe utilizar la sintaxis de escape de cadenas:
select E'\\CAD_SVR\\CADJOBS\\7512-CEDARHURST ELEMENTARY SCHOOL\\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG
Esto funcionará en cualquier caso.
O puede set standard_conforming_strings=on
y uso:
select '\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG
Función quote_literal
se debe utilizar sólo cuando se le consulta para la construcción de una llamada exec
en función PL / pgSQL. Para crear una consulta de un cliente que debe utilizar la función citando la biblioteca de un cliente, al igual que en PQescapeStringConn
libpq o pg_escape_string
en PHP. Sin embargo, la mejor opción es usar comandos preparados y utilizar una cadena como argumento, que elimina todos los presupuestos y es mucho más seguro también.
Otros consejos
Tienes que escapar de la \ con otra \
es decir. \\
Puede cambiar este comportamiento fuera estableciendo la opción standard_conforming_strings en ON. Por defecto está apagado, pero esto va a cambiar por defecto algún momento en el futuro.
recomiendo el doble barra invertida por el momento.