Mysql 使用ESCAPE关键字进行SQL转义-如果在LIKE值中出现转义字符会怎么样

Mysql 使用ESCAPE关键字进行SQL转义-如果在LIKE值中出现转义字符会怎么样,mysql,sql,oracle,escaping,character,Mysql,Sql,Oracle,Escaping,Character,我试图在应用程序中使用转义关键字转义 如果用户输入:A_1I在下划线前添加$,则最终查询如下: SELECT APPLICATION AS "APPLICATION" FROM ALARM WHERE (((APPLICATION LIKE 'A$_1' ESCAPE '$'))) 在我的例子中,用户可以输入任何内容,如果用户在原始字符串中键入$,会发生什么 我之所以使用LIKE关键字,是因为我使用的是通配符%,如果用户键入*,我会在服务器中将其翻译为%,将其用作通配符,但我不想使用通

我试图在应用程序中使用
转义
关键字转义

如果用户输入:
A_1
I在下划线前添加
$
,则最终查询如下:

SELECT APPLICATION AS "APPLICATION"  
FROM  ALARM 
WHERE (((APPLICATION LIKE 'A$_1' ESCAPE '$')))
在我的例子中,用户可以输入任何内容,如果用户在原始字符串中键入
$
,会发生什么

我之所以使用
LIKE
关键字,是因为我使用的是通配符%,如果用户键入
*
,我会在服务器中将其翻译为
%
,将其用作通配符,但我不想使用通配符

如果用户使用
\
键入字符串,我必须使用与
%
相同的
\
(无通配符)进行搜索

例如,如果我的数据库中有名为
A$
的应用程序,并且用户键入了
$
,则查询将是:

SELECT APPLICATION AS "APPLICATION"  
FROM  ALARM 
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$')))
在这种情况下,是否将值设置为
A$
? 在我的查询中,转义字符可以是值中任何位置的任何字符,而不一定是最后的字符

我如何在同一个查询中处理MySQL和Oracle的这种情况? 谢谢

在这种情况下,它的价值是美元吗

在这种情况下,最简单的方法是自己检查:

-- MySQL
SELECT 'First', APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION) ALARM   -- mocking data with inline view
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$'))); 
-- will return a match


SELECT 'Second', APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION) ALARM 
WHERE (((APPLICATION LIKE 'A$_' ESCAPE '$')));
-- 0 rows returned

和甲骨文:

SELECT APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION FROM dual) ALARM
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$')));
-- ORA-01424: missing or illegal character following the escape character


SELECT APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION FROM dual) ALARM
WHERE (((APPLICATION LIKE 'A$_' ESCAPE '$')));
-- no rows selected
“我不想用任何通配符查询我的数据库,通配符在我的应用程序中无效”

如果通配符在应用程序中无效,请不要使用LIKE运算符。您只需要转义下划线,因为您有一个LIKE,而下划线是一个通配符。使用相等运算,问题就会消失

这些条款等同于:

where application like 'A$_1' escape '$'
where application = 'A_1' 
最简单的解决方案是(使用动态SQL)测试用户输入并生成两个不同的查询

1) 对于输入
*
(即应列出所有应用程序)

这与“%”
之类的
应用程序相同(您可以命令
where
子句表示列不可为空

2) 对于其他输入,即仅应使用
=
选择精确匹配的应用程序,而不是像
那样使用

 WHERE  APPLICATION = '{user input}'
不需要逃跑

如果出于某种原因希望统一查询,并在这两种情况下都使用
LIKE
,则必须转义所有通配符和转义字符

要匹配输入
A$
更改为
A$$

要匹配输入,请更改为
A$$$$\u$%

比如说

where  APPLICATION LIKE 'A$$$_$%' ESCAPE '$' 
将匹配字符串

A$_%

但是在我的查询中,转义字符可以是值中的任意位置,而不仅仅是在最后。虽然这段代码可以回答这个问题,但它缺乏解释。请考虑添加文本来解释它所做的,以及它为什么回答所提出的问题。<代码>像'$$'逃逸' $ '/Case>将与ORA-01424失败:在转义符后面的丢失或非法字符。但我不确定在您描述的应用程序中会发生这种情况。也许一些更详细的例子有助于澄清这个问题。@WilliamRobertson我的应用程序基于用户从数据库输入创建动态查询,并将其显示给用户。我不想用任何通配符查询我的数据库,通配符在我的应用程序中无效,因此,如果用户输入包含的字符串,例如,我想搜索它。我的PG、Mysql、OracleI应用程序的意思是,如果输入为%或uu,则通配符无效,但如果用户输入*则我们将其更改为%以用作通配符。对不起,我想我应该解释更多。然后请编辑您的问题,以包含足够的信息,以便我们了解您的实际需求。我设置此答案是因为这是帖子中解释得最清楚的答案。
where  APPLICATION LIKE 'A$$$_$%' ESCAPE '$' 
A$_%