用于 LIKE 表达式的转义列

Escape column for use in LIKE expression

我的服务器可以用作文件存储。无法直接访问文件的存储位置,但可以下载每个文件的 url 存储在数据库中。

当我收到请求时,我想检查它是否与文件的 url 匹配。 url 不必与文件的 url 完全匹配,但可以在末尾包含其他信息。因此,我必须 运行 一个 LIKE 查询才能找到任何匹配的文件:

SELECT * FROM `files` WHERE '<request-url>' LIKE CONCAT(`url`, '%')

这种方法有效,但会产生误报。例如,如果一个文件的 url 是 /file/my_file.pdf,url 类似 /file/my1file.pdf 可以用来访问该文件,因为 _ 是 [=11] 中的通配符=].

如何转义列 url 以便它可以可靠地用于 LIKE 表达式?

额外问题:如果我需要使用 REGEXP 表达式怎么办?

您可以将 _% 替换为 \_\% 以转义它们。

LIKE CONCAT(REPLACE(REPLACE(url, '_', '\_'), '%', '\%'), '%')

另一种选择是不使用 LIKE

WHERE LOCATE(url, '<request-url>') = 1