我正在尝试从 SQL 数据库查询一些信息。我试图匹配的模式看起来像“\%” - 所以我想要一个反斜杠,后跟任何字符串。
我有以下设置:
CREATE TABLE Test(id, integer, name varchar(100));
INSERT INTO Test(id, name) values (1, "A\\");
INSERT INTO Test(id, name) values (1, "A\\B");
以下是不同查询的结果:
SELECT count(*) FROM Test WHERE name LIKE "A%"; -> 2
SELECT count(*) FROM Test WHERE name LIKE "A\\"; -> 1
SELECT count(*) FROM Test WHERE name LIKE "A\\%"; -> 0
SELECT count(*) FROM Test WHERE name LIKE "A\%"; -> 0
特别是考虑到第二个查询的结果,我希望 A\\%
给我两个条目,但我得到零。 A\%
也不起作用,但这实际上是我所期望的,因为 %
在此查询中被转义。
有什么办法可以制定以“\%”结尾的语句吗?
最佳答案
反斜杠是 LIKE 模式中的转义字符。 它是 MySQL/MariaDB 字符串中的转义字符。在 'A\%'
中,它转义了 %
,这意味着它最终会匹配文字百分号。
为了得到模式“'A'
后跟'\'
,后跟任何内容”,我们需要加倍 -转义:
SELECT * FROM Test WHERE name LIKE 'A\\\\%'
当 SQL 解析查询时,一级转义被取消,留下 'A\\%'
,当 LIKE 解释模式时,二级转义被取消,留下 'A\%'
,但现在带有反斜杠。
为 LIKE 子句使用不同的转义字符更易于管理。
SELECT * FROM Test WHERE name LIKE "A\%" ESCAPE '|';
另请参阅:https://mariadb.com/kb/en/library/like/#syntax
<小时/>请注意,这也有效:
SELECT * FROM Test WHERE name LIKE 'A\\\%'
因为解析查询时,'\\'
未转义为 '\'
,而 '\%'
不是有效的转义序列,它无法取消转义并保持 '\%'
。 LIKE
看到的字符串最终与 'A\\\\%
相同。
就我个人而言,我认为这种转义是不干净的。它可以工作,但只能依赖于解析器的怪癖。这也适用于'A\%'
,应该写为'A\\%'
。
关于mysql - 在 SQL 中过滤 "\\%",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57951410/