2010-06-15 241 views
4

我想在Postgresql中編寫一個解析文件路徑的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的解釋斜線跟着某些字符作爲特殊字符。

我該如何逃生?

回答

6

您應該使用轉義字符串語法:

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函數應該只有當你將構造查詢在PL/pgSQL函數調用exec使用。要在客戶端構建查詢,您應該使用客戶端的庫引用功能,如libpq中的PQescapeStringConn或PHP中的pg_escape_string。但最好的選擇是使用準備好的語句並使用字符串作爲參數,從而消除了所有引用,並且也是much safer

+0

我*在*函數中使用了quote_literal。看到我原來的帖子。 我嘗試了你的建議,但仍然沒有得到正確的結果。 – mohnston 2010-06-17 21:25:06

+0

你不明白。你錯誤地調用了這個job_page()函數。你需要在調用job_page之前引用它的參數 - 函數不會爲自己正確引用自己的參數。粘貼一個代碼,在這裏你調用這個函數,然後我們就可以提供幫助。 – Tometzky 2010-06-18 11:44:25

1

你必須逃脫與另一個\ \

即\\

您可以通過設置選項standard_conforming_strings上改變這種行爲了。默認情況下它是關閉的,但是這個默認會在將來改變一段時間。

我推薦暫時使用雙反斜槓。

+0

在這種情況下不起作用。 如果我嘗試替換(「inputText」,'\\','\\\\'),我會得到相同的結果。顯然pg認爲\ 752是一個特殊字符。 (不是反斜槓) – mohnston 2010-06-15 22:38:31