反斜杠在 LIKE 子句中工作不正确
Backslash works incorrectly in LIKE clause
我会使用 LIKE
和反斜杠来搜索一些名字。问题是 Postgres 将反斜杠理解为 LIKE
子句中的转义字符。我尝试打开 standard_conforming_strings
但没有用。
SELECT h.software_id
,h.software_name
FROM software h
WHERE software_name LIKE '%\%';
此查询未显示任何内容,而我有一个软件名称“\”。
我听说有人提到过 prepared statement
。我使用 Hibernate 来执行上述查询。
<persistence-unit name="policyPersistence" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/MyApp</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
</properties>
</persistence-unit>
JPA
query.setParameter(1, "%" + searchCriteria.getSoftwareName() + "%");
但是 Postgres 没有正确转义反斜杠。
如何解决?
这应该有效:
SELECT h.software_id,
h.software_name
FROM software h
WHERE software_name LIKE '%\\%';
反斜杠是 SQL 的 LIKE 子句和一般字符串的转义前缀,因此是双重转义。
与常规字符串文字不同,反斜杠确实充当转义字符,更改 standard_conforming_strings
不会改变这一点。
为了能够使用 LIKE
搜索 %
或 _
,您可以使用 escape
子句:where x like '%#_' escape '#'
,它定义了字符 #
作为 like 条件的转义字符。转义字符后面的任何字符都不会被解释为通配符。因此 like '%#_' escape '#'
搜索 结尾 带有下划线的值。
反斜杠是默认转义字符,因此不指定 escape
子句与指定 escape '\'
相同(此行为由 SQL 标准定义)。
所以你需要使用:
select *
from stuff.foo
where software_name like '%\%' escape '#'
以防止 Postgres 使用 \
作为转义字符。唯一的其他方法是使用 '%\%'
转义反斜杠(注意:这里只有 两个 反斜杠,而不是 TimoSta 建议的四个)。
这是 Postgres 手册的link:
http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE
我会使用 LIKE
和反斜杠来搜索一些名字。问题是 Postgres 将反斜杠理解为 LIKE
子句中的转义字符。我尝试打开 standard_conforming_strings
但没有用。
SELECT h.software_id
,h.software_name
FROM software h
WHERE software_name LIKE '%\%';
此查询未显示任何内容,而我有一个软件名称“\”。
我听说有人提到过 prepared statement
。我使用 Hibernate 来执行上述查询。
<persistence-unit name="policyPersistence" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/MyApp</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
</properties>
</persistence-unit>
JPA
query.setParameter(1, "%" + searchCriteria.getSoftwareName() + "%");
但是 Postgres 没有正确转义反斜杠。
如何解决?
这应该有效:
SELECT h.software_id,
h.software_name
FROM software h
WHERE software_name LIKE '%\\%';
反斜杠是 SQL 的 LIKE 子句和一般字符串的转义前缀,因此是双重转义。
与常规字符串文字不同,反斜杠确实充当转义字符,更改 standard_conforming_strings
不会改变这一点。
为了能够使用 LIKE
搜索 %
或 _
,您可以使用 escape
子句:where x like '%#_' escape '#'
,它定义了字符 #
作为 like 条件的转义字符。转义字符后面的任何字符都不会被解释为通配符。因此 like '%#_' escape '#'
搜索 结尾 带有下划线的值。
反斜杠是默认转义字符,因此不指定 escape
子句与指定 escape '\'
相同(此行为由 SQL 标准定义)。
所以你需要使用:
select *
from stuff.foo
where software_name like '%\%' escape '#'
以防止 Postgres 使用 \
作为转义字符。唯一的其他方法是使用 '%\%'
转义反斜杠(注意:这里只有 两个 反斜杠,而不是 TimoSta 建议的四个)。
这是 Postgres 手册的link:
http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE