我有一个数据库条目,其条目如下所示:
id | name | code_set_id
我有这个特殊的条目,我需要找到:
674272310 | raphodo/qrc_resources.py | 782732
在我的rails应用程序(2.3.8)中,我有一个评估为:
的语句SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc\\_resources.py%';
从阅读转义中,上述查询是正确的。这应该正确地双重逃避下划线。但是,此查询未在数据库中找到该记录。这些查询将:
SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc\_resources.py%';
SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc_resources.py%';
我在这里遗漏了什么吗?为什么第一个SQL语句没有找到正确的条目?
答案 0 :(得分:1)
LIKE escapes the following character的RHS中的单个反斜杠:
<强> 9.7.1。 LIKE 强>
[...]
要匹配文字下划线或百分号而不匹配其他字符, pattern 中的相应字符必须以转义字符开头。默认转义字符是反斜杠,但可以使用ESCAPE
子句选择不同的转义字符。要匹配转义字符本身,请写两个转义字符。
所以这是LIKE模式中的文字下划线:
\_
这是一个反斜杠后跟一个“任何字符”模式:
\\_
你想要LIKE看到这个:
raphodo/qrc\_resources.py%
PostgreSQL默认情况下用于解释字符串中的C-stye反斜杠转义但现在不得不使用E'...'
在字符串文字中使用反斜杠转义(除非您更改了配置选项)。本手册的String Constants with C-style Escapes部分涵盖了这一点,但简单的版本就是这两个部分:
name LIKE E'raphodo/qrc\\_resources.py%'
name LIKE 'raphodo/qrc\_resources.py%'
做与PostgreSQL 9.1相同的事情。
据推测,你的Rails 2.3.8应用程序(或者正在准备你的LIKE模式的任何东西)假定PostgreSQL的旧版本比你实际使用的版本更早。你需要调整一些东西,不要把你的反斜杠加倍(或者用E
s作为模式字符串文字的前缀。)