我们建三张表,分别用 LONGBLOB、LONGTEXT 和 VARCHAR 来存储这些图片信息
mysql show create table tt_image1G
*************************** 1. row ***************************
Table: tt_image1
Create Table: CREATE TABLE `tt_image1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image2G
*************************** 1. row ***************************
Table: tt_image2
Create Table: CREATE TABLE `tt_image2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql show create table tt_image3G
*************************** 1. row ***************************
【mysql中怎么插入图片 mysql添加图片】Table: tt_image3
Create Table: CREATE TABLE `tt_image3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
我们来给三张表插入 100 张图片(插入前 , 建议把 max_allowed_packet 设置到最大)
tt_image1
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image1(image_file)
values (load_file('/var/lib/mysql-files/$i.jpg'))";done;
tt_image2
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image2(image_file)
values (hex(load_file('/var/lib/mysql-files/$i.jpg')))";done;
tt_image3
root@ytt:/var/lib/mysql-files# aa='begin;';for i in `seq 1 100`;
do aa=$aa"insert into ytt.tt_image3(image_file) values
('/var/lib/mysql-files/$i.jpg');";
done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqld.sock -e "`echo $aa`";
检查下三张表记录数
mysql select 'tt_image1' as name ,count(*) from tt_image1 union allselect 'tt_image2',count(*) from tt_image2 union all select 'tt_image3', count(*) from tt_image3;+-----------+----------+| name| count(*) |+-----------+----------+| tt_image1 |100 || tt_image2 |100 || tt_image3 |100 |+-----------+----------+3 rows in set (0.00 sec)
看下文件大小 , 可以看到实际大小排名,LONGTEXT 字段存储的最大 , LONGBLOB 字段缩小到一半 , 最小的是存储图片路径的表 tt_image3 。所以这里从存储空间来看,存放路径最占优势 。
root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image*274603 1.1G -rw-r----- 1 mysql mysql 1.1G Jul 11 07:27 tt_image2.ibd274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1.ibd27460580K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3.ibd
那么怎么把图片取出来呢?
tt_image3 肯定是最容易的
mysql select * from tt_image3;+----+----------------------------+| id | image_file|+----+----------------------------+|1 | /var/lib/mysql-files/1.jpg |+----+----------------------------+...100 rows in set (0.00 sec)
tt_image1 直接导出来二进制文件即可,下面我写了个存储过程,导出所有图片 。
mysql DELIMITER $$mysql USE `ytt`$$mysql DROP PROCEDURE IF EXISTS `sp_get_image`$$mysql CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()mysql BEGINDECLARE i,cnt INT DEFAULT 0;SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt;WHILE icnt DOSET @stmt = CONCAT('select image_file from tt_image1limit ',i,',1 into dumpfile ''/var/lib/mysql-files/image',i,'.jpg''');PREPARE s1 FROM @stmt;EXECUTE s1;DROP PREPARE s1;SET i = i + 1;END WHILE;END$$mysql DELIMITER ;mysql call sp_get_image;
tt_image2 类似 , 把 select 语句里 image_file 变为 unhex(image_file) 即可 。
推荐阅读
- css通过两个属性值定位元素,css的两个特性
- 视频号关注数不显示,视频号什么是有效关注数
- 微信建立视频号怎么建立,微信如何创建视频号
- 如何将文件转为pdf附件,将文件转为pdf怎么弄
- mysql主键约束怎么写 mysql的主键约束相当于唯一约束和什么约束的组合
- 汉中专注sap开发公司,汉中seo
- 显卡biss怎么升级,显卡bios更新有什么好处
- 即时城镇游戏,即时类游戏是什么
- linux命令up linux命令upload