如何在MySQL中插入BLOB和CLOB文件?

33

我想使用软件前端存储图像和.docx/.doc、.pptx/.ppt、.pdf文件。我不知道如何实现此功能,也不知道如何将BLOB和CLOB文件插入表中。请帮忙。

我正在使用Kubuntu 11.04,MySQL5,Qt 4.7.3。

6个回答

44

两种方法:

1 - 使用LOAD_FILE函数 -

INSERT INTO table1 VALUES(1, LOAD_FILE('data.png'));

2 - 将文件作为十六进制字符串插入,例如 -

INSERT INTO table1 VALUES 
  (1, x'89504E470D0A1A0A0000000D494844520000001000000010080200000090916836000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000001E49444154384F6350DAE843126220493550F1A80662426C349406472801006AC91F1040F796BD0000000049454E44AE426082');

3
第三个选项与第二个选项非常接近,其语法为 INSERT INTO table1 VALUES (1, 0x89504E470D0A1A0A0000000D494844520000001000000010080200000090916836000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000001E49444154384F6350DAE843126220493550F1A80662426C349406472801006AC91F1040F796BD0000000049454E44AE426082); - glglgl
1
检查文件是否存在,检查路径,检查文件大小,它是否超过了 max_allowed_packet。您是否拥有 FILE 权限?BLOB 字段的类型是什么,它是否足以存储该文件? - Devart
1
如果有人能帮我理解从数据库下载文件的概念,我将不胜感激。我的意思是,例如,如果我上传了一些 .pdf 或 .jpg 文件,那么客户端如何下载它们? - user1411472
插入到 pic 表中的值为 LOAD_FILE("home/pkr/Desktop/DSC09566.JPG");查询成功,影响1行数据,用时0.05秒。 - user1411472
输出-选择*从pic; +------+ | 图片 | +------+ | 空 | | 空 | | 空 | | 空 | | 空 | +------+ 共5行(0.00秒) - user1411472
显示剩余5条评论

16
INSERT INTO MY_TABLE(id, blob_col) VALUES(1, LOAD_FILE('/full/path/to/file/myfile.png')

LOAD_FILE函数有许多附加条件。根据MySQL文档

LOAD_FILE(file_name)

读取文件并将文件内容作为字符串返回。要使用此函数,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且必须具有FILE特权。该文件必须可供所有人阅读,并且其大小必须小于max_allowed_packet字节。如果secure_file_priv系统变量设置为非空目录名称,则要加载的文件必须位于该目录中。

如果文件不存在或无法读取,因为不满足前面的任何条件,则该函数返回NULL。

此外,在Linux中,LOAD_FILE存在一些错误。请参见http://bugs.mysql.com/bug.php?id=38403以获取错误信息和MySQL LOAD_FILE returning NULL以获取解决方法。 在Ubuntu 12.04,MySQL 5.5.32上,以下方法适用:

  1. 将文件复制到/tmp
  2. 更改文件所有者为mysql用户chown mysql:mysql /tmp/yourfile
  3. 以mysql root用户身份登录mysql,以确保您拥有FILE权限
  4. 运行您的插入语句

1
“secure_file_priv”提示真是救了我的一天。使用mysql> SELECT @@secure_file_priv;查看实际值。 - Frank Neblung

9

或者你可以仅使用MySQL Workbench,选择行、最后一行,在不包含blob的情况下插入一行,然后右键单击并选择“从文件加载值”。

enter image description here


1
这就是我需要的,但我不知道它的存在。怪我自己。 - Panini Luncher
不好的解决方案,完全依赖第三方工具。 - Enerccio

2
INSERT INTO table1 VALUES(1, LOAD_FILE(data.png));

无法工作,但是

INSERT INTO table1 VALUES(1, LOAD_FILE('data.png'));

假设data.png在本地目录中存在,则应该:


2

对于那些在通过查询保存Blob时遇到“列'image'不能为空”的人:

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

Original Answer:

mysql> SHOW VARIABLES LIKE "secure_file_priv";

这将向您展示MySql访问文件时使用的安全路径,类似于"最初的回答"。
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

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

0
如果您正在使用MySQL Workbench,只需右键单击字段(单元格),然后选择“从文件加载值”选项,然后浏览到文件并单击打开,然后单击应用。它将自动生成类似于以下的查询语句:
UPDATE `dbname`.`tablename` SET `columnname` = ? WHERE (`row` = '1');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接