MySQL load_file() 用于 .zip 文件夹

IDK*_*IDK 6 mysql windows-10

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

Mik*_* F. 6

我注意到了同样的现象。

这确实看起来有点奇怪,而且与操作系统有关。这是我的调查结果(使用 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                                   |
+----------------------------------------+
Run Code Online (Sandbox Code Playgroud)

从改变文件扩展名.zip.zip_为前。解决了这个问题:

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      |
+---------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

给予EVERYONE获得的zip文件允许load_file访问原来的zip文件的功能。使用以下 Powerhell 脚本(从此处采用)授予访问权限后:

$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
Run Code Online (Sandbox Code Playgroud)

load_file 能够访问 zipfile:

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      |
+---------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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