MySQL可以检查该文件是否存在?

Win*_*ges 5 mysql file-exists

我有一个表,其中包含HDD上实际文件的相对路径.例如:

SELECT * FROM images -->
id | path
1  | /files/1.jpg
2  | /files/2.jpg
Run Code Online (Sandbox Code Playgroud)

我可以创建一个查询来选择指向不存在的文件的所有记录吗?我需要完全通过MySql服务器检查它,而不使用PHP客户端中的迭代.

Mat*_*ari 10

我会使用这样的查询:

SELECT id, path, ISNULL(LOAD_FILE(path)) as not_exists
FROM images
HAVING not_exists = 1
Run Code Online (Sandbox Code Playgroud)

该函数LOAD_FILE尝试将文件作为字符串加载,并NULL在失败时返回.

请注意,在这种情况下失败的原因可能是mysql根本无法读取该特定位置,即使该文件确实存在.

编辑:

正如@ostrokach在评论中指出的那样,这不是标准的SQL,即使MySQL允许它,也可以遵循标准:

SELECT *
FROM images
WHERE LOAD_FILE(PATH) IS NULL
Run Code Online (Sandbox Code Playgroud)


ost*_*ach 5

MySQLLOAD_FILE命令对其可以打开的文件有非常严格的要求。来自 MySQL 文档:

[ LOAD_FILE] 读取文件并以字符串形式返回文件内容。要使用此功能,文件必须位于服务器主机上,必须指定文件的完整路径名,并且必须具有 FILE 权限。该文件必须可供所有人读取,并且其大小小于 max_allowed_pa​​cket 字节。如果 secure_file_priv 系统变量设置为非空目录名,则要加载的文件必须位于该目录中。

因此,如果用户无法访问该文件mysql或任何其他要求不满足,LOAD_FILE将返回Null.


您可以使用以下命令获取与丢失文件相对应的 ID 列表awk

mysql db_name --batch -s -e“从图像中选择id,路径”\
    | awk '{if(system("[ -e " $2 " ]") == 1) {print $1}}' \
    >> 缺失_ids.txt

或者简单地使用bash

mysql db_name --batch -s -e“从图像中选择id,路径”\
    | 同时读取 id 路径;如果 [[ -e "$path" ]] ; 然后回显 $id ;完毕
    >> 缺失_ids.txt

这还有一个优点,就是比LOAD_FILE.


小智 2

MYSQL 仅处理数据库,因此您无法触发 SQL 语句来检查 HDD 上的文件是否存在。您需要迭代行并使用 PHP 检查它。