当我将图像插入 MySQL 表时,结果为 NULL

Posted

技术标签:

【中文标题】当我将图像插入 MySQL 表时,结果为 NULL【英文标题】:When I insert a image into MySQL table the result is NULL 【发布时间】:2017-06-03 01:12:30 【问题描述】:

这段代码有什么问题,我想在表格中插入一个图像,但是当我执行这段代码时,图像字段的结果是NULL

我尝试使用 mysql Workbench 执行:

CREATE TABLE image(keyh int, img blob);
INSERT INTO image VALUES(1, load_file('d:\Picture\cppLogo.png'));

【问题讨论】:

你已经检查过了? - dev.mysql.com/doc/refman/5.7/en/… 可能性:使用load_file('d:/Picture/cppLogo.png'),即将dos反斜杠改为unix正斜杠 请注意,BLOB 数据类型的最大存储空间为 64K 字节。建议使用 MEDIUMBLOB(最大为 16M)或 LONGBLOB(4G 大小)参考dev.mysql.com/doc/refman/5.7/en/string-type-overview.html ok,我会尝试将类型转换为 longblob 【参考方案1】:

要使用此功能,文件必须位于服务器主机上,您 必须指定文件的完整路径名,并且您必须具有 文件权限。该文件必须是所有人都可以读取的,并且它的大小更小 超过 max_allowed_pa​​cket 字节。如果 secure_file_priv 系统变量 设置为非空目录名,要加载的文件必须是 位于该目录中。

如果文件不存在或无法读取,因为其中一个 前面的条件不满足,函数返回NULL

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file

你能做什么?

检查 mysql 正在与哪个用户一起运行,并确保该文件可以被该用户读取。确保安全设置允许读取文件并且文件大小不大于max_allowed_packet

SHOW VARIABLES LIKE 'max_allowed_packet'

对我来说,该文件似乎在您的本地主机上,您尝试上传它。使用LOAD_FILE() 是不可能的。该文件必须已经在服务器上。

这个问题也可能是你的windows目录分隔符\(就像RiggsFolly说的那样),它用于转义,然后切换到unix样式/

LOAD_FILE('D:/Picture/cppLogo.png')

或者您的图片文件大小超过了BLOB 字段可以容纳的大小,就像Balazs Vago 所说的那样。

【讨论】:

Dan,这看起来像 windows,所以假设文件与 MYSQL 权限位于同一台 PC 上应该不是问题 你可能是对的。也许这只是因为你说的目录分隔符。 随意将其添加到您的答案中 @RiggsFolly 实际上,在某些版本的 Windows 中,可能需要在管理员下运行。我已经看到了这种情况。 是的,你是 d'man @Fred-ii- 但根据我的经验,MYSQL 服务通常以管理员身份运行。除非用户掌握得很好【参考方案2】:

我发现正确的语法如下:

C:/wamp/binsql5.5.20/data/56VRLRFE.jpg'

不是这个

C:\wamp\binsql5.5.20\data\56VRLRFE.jpg'

感谢大家的回答:D

【讨论】:

【参考方案3】:

打开你的 MySql 命令行客户端并使用 root 用户登录并输入

mysql> SHOW VARIABLES LIKE "secure_file_priv";

这将显示 MySql 用于访问文件的安全路径。像

+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

您可以将文件粘贴到此文件夹中或将“secure_file_priv”变量值更改为“空字符串”,以便它可以从任何地方读取文件。

【讨论】:

【参考方案4】:

在 Windows 上,根本问题是默认情况下,MySql 在网络帐户下作为 Windows 服务运行,这意味着服务器只能访问几个文件位置。因此,要使 load_file 工作,该文件必须放在服务器上可由服务读取的文件夹中。似乎没有这方面的文档。在我的调查中,与 load_file 一起使用的唯一文件夹是 C:\ProgramData\MySQL\MySQL Server 8.0\Uploads

运行查询以测试负载...

select load_file('C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\1.txt') ;

注意,在 Windows 上,您必须使用双 \ 或 / 来分隔路径元素。这将在失败时返回 NULL,否则返回文件的内容。

现在假设有一个名为 db.image 的表,其中包含 source 和 image 列。源是字符,图像是 blob。将 a.jpg 加载到表中的命令是

insert into db.image (source,image) values ('a.jpg',load_file('c:/programdata/mysql/mysql server 8.0/uploads/a.jpg'));

【讨论】:

以上是关于当我将图像插入 MySQL 表时,结果为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

在将数据从文件插入表时,如何用 NULL 替换 NA 值?

当结果插入 HSQLDB 表时,如何对结果进行排序?

通过 PHP 将数据插入 MySQL 表时出错

mysql建表时怎样设置datetime类型的字段默认值为不自动更新的系统当前时间

MySQL—— 数据库的约束 (nulluniqueprimary keydefaultforeign keycheck)

mysql创建表时的空值和非空值设置有啥讲究