Postgresql为什么' m'喜欢E'%\\ m%'是真的

时间:2014-04-02 09:19:06

标签: postgresql

首先假设我们有这个带有转义字符串的字符串:

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%

现在我们将尝试使用以下内容:

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 doc部分来描述这个。

1 个答案:

答案 0 :(得分: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 = on(在9.1之后默认启用)