2010-06-15 3 views
4

J'essaye d'écrire une fonction sql dans Postgresql qui va analyser un chemin de fichier. Je veux juste retourner le nom du fichier.Ejection de barre oblique inverse dans Postgresql

Je n'arrive pas à obtenir une chaîne de texte précise dans la fonction.

Voici la fonction:

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

BEGIN 
    $5 = quote_literal("inputText"); 
    return $5; 
END 

Quand je lance ceci:

select job_page('\\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG') 

Je reçois ce résultat:

"E'\\CAD_SVRCADJOBSé2-CEDARHURST ELEMENTARY SCHOOLé2-20.DWG'" 

Postgresql interprète la barre oblique suivie par certains caractères comme Caractère spécial.

Comment s'échapper?

Répondre

6

Vous devez utiliser la syntaxe de chaîne d'échappement:

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

\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG 

Cela fonctionne dans tous les cas.

Ou vous pouvez set standard_conforming_strings=on et de l'utilisation: la fonction

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

\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG 

quote_literal doit être utilisé que lorsque vous construirons une requête pour exec appel en pl/pgsql fonction. Pour construire une requête dans un client, vous devez utiliser la fonction de création de bibliothèque d'un client, par exemple PQescapeStringConn dans libpq ou pg_escape_string dans PHP. Mais la meilleure option est d'utiliser des instructions préparées et d'utiliser une chaîne en tant qu'argument, ce qui élimine toute citation et est également much safer.

+0

I * am * utilise quote_literal dans une fonction. Voir mon message original. J'ai essayé comme vous l'avez suggéré mais je n'obtiens toujours pas le bon résultat. – mohnston

+0

Vous ne comprenez pas. Vous appelez cette fonction job_page() à tort. Vous devez citer son argument avant d'appeler job_page - il n'y a aucun moyen pour une fonction de citer correctement son propre argument. Collez un code, où vous appelez cette fonction et nous serons en mesure d'aider. – Tometzky

1

Vous avez pour échapper à la \ avec un autre \

dire \\

Vous pouvez modifier ce comportement hors en définissant l'option standard_conforming_strings sur ON. Par défaut, il est désactivé, mais cette valeur par défaut changera dans le futur.

Je recommande le double antislash pour le moment.

+0

Ne fonctionne pas dans ce cas. Si j'essaie de remplacer ("inputText", '\\', '\\\\') j'obtiens le même résultat. Évidemment pg voit \ 752 comme un caractère spécial. (pas une barre oblique inverse) – mohnston

Questions connexes