用于 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
我的服务器可以用作文件存储。无法直接访问文件的存储位置,但可以下载每个文件的 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