首先假设我们有这个带有转义字符串的字符串:
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部分来描述这个。
答案 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之后默认启用)