mysql - 如何使用 shell 脚本在 MySql 数据库中批量插入/更新图像

标签 mysql shell blob bulkinsert

我有包含图像 (*.jpg) 文件的目录 我有 mysql 数据库和带有数据的表项(id、描述、图像)。 我想将图像上传到表格项目中。图像的每个文件名等于表项中的每个 id。如果图像为空,或者图像内容不等于具有相同 id 的文件内容,则应上传文件。

如何使用 shell 脚本在 MySql 数据库中批量插入/更新图像? 你能提供 shell 脚本的示例代码吗?

最佳答案

您可以在 INSERT 语句中使用 LOAD_FILE() 函数 ( http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_load-file ),甚至可以使用 LOAD DATA INFILE 如果您使用用户变量。

示例:

CREATE TABLE t1 (id int not null primary key, img longblob);
CREATE TABLE t2 (id int not null primary key);
INSERT INTO t2 VALUES (1),(2),(3);
INSERT INTO t1 
SELECT id,LOAD_FILE(CONCAT('/var/www/images/',t2.id,'.jpg')) FROM t2;

该文件需要是全世界可读的,用户需要具有FILE权限,并且该目录可能受到服务器设置secure_file_priv的限制。您还需要确保 max_allowed_pa​​cked 大于最大文件的大小。

要从目录加载,您可以执行以下操作(经过测试的代码,完整示例包括为了清晰起见而创建的表):

#! /bin/bash

dir=/home/sasha
ext=jpg
chmod a+r $dir/*.$ext
mysql -uroot test <<eot
drop table if exists t1;
create table t1 (name varchar(128), data longblob); 
eot
ls -1 $dir/*.$ext | perl -e 'print "insert into t1(name,data) values ".join(",",map {chop;$f="\"".$_."\""; "($f,load_file($f))"} <>);' | mysql -uroot test

以上代码将/home/sasha中所有扩展名为jpg的文件加载到表test.t1中。

编辑:解决您对使用 Perl 的担忧。您可以假设 Perl 安装在拥有 MySQL 服务器的 Ubuntu 系统上,因为它是 mysql-server-5.5(也可能是较新版本)的依赖项之一。您可以使用以下命令验证这一点:

dpkg-query -p mysql-server-5.5 | grep Depends

如果这还不够好,你可以使用 Awk 来代替解析,但我不认为有什么意义。

关于mysql - 如何使用 shell 脚本在 MySql 数据库中批量插入/更新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049169/

相关文章:

python - 使用Python加载数据到Mysql

linux - crontab 不执行复杂的 bash 脚本

mysql - shell 脚本 if 条件

javascript - 通过 jQuery 提供的文件被解释为 txt/blob,而不是正确的文件类型

azure - 逻辑应用程序 : List blobs pagination limit

mysql - Hibernate 选择空对象

mysql - 选择月份位于开始日期和结束日期之间的行的更好方法

mysql - 如何在同一列上有多个 OR 条件

shell - 在后台运行的 ssh 进程被暂停

javascript - 使用文件读取器和 blob 显示图像