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所述,使用设置适当权限的归档程序也是一种解决方案。
我有几个文件想一起存储在 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所述,使用设置适当权限的归档程序也是一种解决方案。