MySQL load_file() 对于 .zip 文件夹

MySQL load_file() for .zip folders

我有几个文件想一起存储在 mysql table 的 blob 类型列中。所以我只是把它们放在一个文件夹里,然后压缩它。我在使用 load_file() 函数存储图像、文本和 pdf 文件时从未遇到过任何问题,但是当我尝试使用 .zip 文件夹时,我得到了 NULL 值。 我错过了什么?谢谢!

我无法重现问题。查看控制台输出:

mysql> CREATE TABLE test (val BLOB);
Query OK, 0 rows affected (0.29 sec)

mysql> INSERT INTO test SELECT LOAD_FILE('C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\test.sql');
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO test SELECT LOAD_FILE('C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\test.zip');
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT LENGTH(val) FROM test;
+-------------+
| LENGTH(val) |
+-------------+
|        5603 |
|       17725 |
+-------------+
2 rows in set (0.00 sec)

我也注意到了同样的现象。

确实有点奇怪,确实和OS有关。这是我的调查结果(使用 MARIA DB 10.4,Windows 10 Pro20H2):

在给定的文件夹中,例如 C:\zipfolder,我创建了一个包含一些文本内容的文本文件 zipdoc.txt 和一个包含该文本文件的 zip 文件。

这给出了以下 load_file 输出:

select load_file('C:\zipfolder\zipdoc.txt');
+----------------------------------------+
| load_file('C:\zipfolder\zipdoc.txt') |
+----------------------------------------+
| zipcontent text                        |
+----------------------------------------+

select load_file('C:\zipfolder\zipdoc.zip');
+----------------------------------------+
| load_file('C:\zipfolder\zipdoc.zip') |
+----------------------------------------+
| NULL                                   |
+----------------------------------------+

将文件扩展名从 .zip 更改为 .zip_ for ex.修复问题:

select load_file('C:\zipfolder\zipdoc.zip_');
+---------------------------------------------------------------------------------------------------------------------------------------+
| load_file('C:\zipfolder\zipdoc.zip_')                                                                                               |
+---------------------------------------------------------------------------------------------------------------------------------------+
| PK♥♦¶     FÄLR├SAÏ☼   ☼
   zipdoc.txtzipcontent textPK☺☻¶ ¶     FÄLR├SAÏ☼   ☼
       ☺         zipdoc.txtPK♣♠    ☺ ☺ 8   7      |
+---------------------------------------------------------------------------------------------------------------------------------------+

因此,看起来 Windows 10 正在以比其他文件更严格的方式阻止对 .zip 文件的访问。

授予 EVERYONE 对 zip 文件的访问权限允许 load_file 函数访问原始 zip 文件。使用以下 Powerhell 脚本(取自 here)授予访问权限后:

$acl = Get-Acl C:\zipfolder\zipdoc.zip
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Jeder","Read","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl C:\zipfolder\zipdoc.zip

load_file 能够访问压缩文件:

select load_file('C:\zipfolder\zipdoc.zip');
+---------------------------------------------------------------------------------------------------------------------------------------+
| load_file('C:\zipfolder\zipdoc.zip')                                                                                                |
+---------------------------------------------------------------------------------------------------------------------------------------+
| PK♥♦¶     FÄLR├SAÏ☼   ☼
   zipdoc.txtzipcontent textPK☺☻¶ ¶     FÄLR├SAÏ☼   ☼
       ☺         zipdoc.txtPK♣♠    ☺ ☺ 8   7      |
+---------------------------------------------------------------------------------------------------------------------------------------+

因此,解决方案是授予 EVERYONE 对 zip 文件的访问权限或仅更改文件的扩展名(管理员仍然需要找到一个更严格的工作访问级别)。

补充:如@Álvaro González所述,使用设置适当权限的归档程序也是一种解决方案。