2014-04-02 71 views
0

首先讓我們假設我們有這個字符串與轉義:爲什麼PostgreSQL的 'M' 像E '\%M%' 是真實的

select E'%m%' as m, E'%\m%' as m1, E'%\\m%' as m2, E'%\\\m%' as m3, E'%\\\\m%' m4; 
    m | m1 | m2 | m3 | m4 
-----+-----+------+------+------- 
%m% | %m% | %\m% | %\m% | %\\m% 

現在我們將嘗試喜歡這個matsh:

select 'm' like E'%m%' as m, 'm' like E'%\m%' as m1, 'm' like E'%\\m%' as m2, 'm' like E'%\\\m%' as m3, 'm' like E'%\\\\m%' m4; 
m to m | m to m1 | m to m2 | m to m3 | m to m4 
--------+----------+---------+---------+-------- 
t  | t  | t  | t  | f 

我能理解爲什麼m到m是真的,m到m1是真的。

我無法理解的是爲什麼m到m2(以及m到m3也是)也是如此。

任何人都可以描述爲什麼這個或通過我psql文檔部分與此描述。

回答

1

這是因爲LIKE也使用轉義,如C-style escapes

E'%\\\m%' = '%\m%' 
E'%\\\\m%' = '%\\m%' 

從而

'm' LIKE '%\m%' = 'm' LIKE '%\m%' ESCAPE '\' = 'm' LIKE '%m%' ESCAPE '' 
'm' LIKE '%\\m%' = 'm' LIKE '%\\m%' ESCAPE '\' = 'm' LIKE '%\m%' ESCAPE '' 

'\m' LIKE '%\\m%' = TRUE 

注意:那是因爲你在用你的兩個常量&像表達式未知轉義序列(\m)。你不應該依賴這些,在任何地方使用正確的逃跑。

編輯:我的例子中使用standard_conforming_strings =(這是由9.1後默認)

+0

在這種情況下,它似乎是使用'standard_conforming_strings',即不使用'E '...''字符串,會大大簡化事情。 –

+0

啊,是的。忘記提及這一點。 – pozs

相關問題