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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top