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$_%