mysql - 在 SQL 中过滤 "\\%"

标签 mysql mariadb

我正在尝试从 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/

相关文章:

MYSQL选择当前连续获胜

php - 不同行的MySQL总和

php - MySQL 查询的错误处理

mysql - Spring Hibernate 无法在初始化数据库时添加外键约束

mysql - MariaDB设置: Access denied for user 'root' @'ma' (using password: YES)

python - 将 PyMySQL 与 MariaDB 结合使用

PHP 关联数组不打印第一个和第五个键

MySQL 搜索和替换正则表达式

mysql - 选择一行匹配条件,如果没有,则选择第一个

mysql - 选择不包含其他表引用的记录