mysql图片类型_MySQL里存储图片的是什么数据类型?_Mag1cal的博客-程序员秘密

技术标签: mysql图片类型  

[email protected]:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信图片_20190711095019.jpg "$i".jpg;done;

[email protected]:/var/lib/mysql-files# ls

100.jpg   17.jpg  25.jpg  33.jpg  41.jpg  4.jpg   58.jpg  66.jpg  74.jpg  82.jpg  90.jpg  99.jpg  f8.tsv

10.jpg    18.jpg  26.jpg  34.jpg  42.jpg  50.jpg  59.jpg  67.jpg  75.jpg  83.jpg  91.jpg  9.jpg   微信图片_20190711095019.jpg

1111.jpg  19.jpg  27.jpg  35.jpg  43.jpg  51.jpg  5.jpg   68.jpg  76.jpg  84.jpg  92.jpg  f1.tsv

11.jpg    1.jpg   28.jpg  36.jpg  44.jpg  52.jpg  60.jpg  69.jpg  77.jpg  85.jpg  93.jpg  f2.tsv

12.jpg    20.jpg  29.jpg  37.jpg  45.jpg  53.jpg  61.jpg  6.jpg   78.jpg  86.jpg  94.jpg  f3.tsv

13.jpg    21.jpg  2.jpg   38.jpg  46.jpg  54.jpg  62.jpg  70.jpg  79.jpg  87.jpg  95.jpg  f4.tsv

14.jpg    22.jpg  30.jpg  39.jpg  47.jpg  55.jpg  63.jpg  71.jpg  7.jpg   88.jpg  96.jpg  f5.tsv

15.jpg    23.jpg  31.jpg  3.jpg   48.jpg  56.jpg  64.jpg  72.jpg  80.jpg  89.jpg  97.jpg  f6.tsv

16.jpg    24.jpg  32.jpg  40.jpg  49.jpg  57.jpg  65.jpg  73.jpg  81.jpg  8.jpg   98.jpg  f7.tsv

我们建三张表,分别用 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 ***************************

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

[email protected]:/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

[email protected]:/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

[email protected]:/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。所以这里从存储空间来看,存放路径最占优势。

[email protected]:/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.ibd274605  80K -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> BEGIN      DECLARE i,cnt INT DEFAULT 0;      SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt;      WHILE i < cnt DO        SET @stmt = CONCAT('select image_file from tt_image1  limit ',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) 即可。

总结

这里我举了个用 MySQL 来存放图片的例子,总的来说有以下三点:

占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取操作等)

使用不易

还是推荐用文件路径来代替实际的文件内容存放

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32487755/article/details/113138316

智能推荐

Xml节点解析 Android,【已解决】Android中用DOM方式解析xml时使用getElementsByTagName去获得节点结果为空..._櫻花朽木的博客-程序员秘密

【问题】折腾:时,试了试下面代码:public static ArrayList getXmlItems(InputStream inputStream, String tag){ArrayList xmlItemList = new ArrayList();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();...

MySQL社区版下载及安装教程_mysql 免費版_KonBAI-Q的博客-程序员秘密

MySQL社区版下载及安装教程1、下载此教程演示为MySQL8社区版压缩包版本的,点击以下链接进入下载页面(需要Oracle账号,没有的可先进行注册)MySQL下载链接完成后,我们就得到一个压缩包,把这个压缩包进行解压(这里我演示是并不是最新版)2、配置环境变量// 变量值为MYSQL根目录变量名:MYSQL_HOME变量值:~\mysql-8.0.xx-winx64 //(这...

Spyder点击无反应,无法正常启动_spyder双击没反应_bottle想暴富的博客-程序员秘密

Spyder无法正常使用今天一起来打算开始好好学习的时候,多次点击spyder都没啥反应,俺以为我的spyder又完了,抱着试试的心态重启电脑,结果还是没用。在网上查了资料之后,发现了一个方法可以知道是啥问题导致的spyder无法启动,我之前那一次就是重新安装,为难死俺了,记录一下万一忘记了。环境:python3.7 win10一开始无法启动我去网上查资料,很多人通过重新安装pyQT5就成...

计算机保研经验(中科大、北航、成电、西交、南大)_计算机保研经验介绍_Xixixihohoho的博客-程序员秘密

2020年是目前来讲保研er最难打的一场战。(疫情导致许多具有光环背景的出国选手加入了保研竞争行列当中)在网上看了许多帖子大多数都是大神经验贴,所以我这个三无选手决定整理一下自己的经历,把我知道的分享给大家。希望可以在这个目测会延续2020年保研特点的2021年帮助到各位学弟学妹。学校:某211专业:计算机科学与技术绩点:3.9排名:4%荣誉以及奖项:美赛M、参加过一个小项目、有过研究所的实习、一等奖学金。

使用file-saver和xlsx插件下载excel_xlsx用什么loader_qq_45700938的博客-程序员秘密

安装命令npm install -S file-saver(生产依赖,则为-s)npm install -S xlsxnpm install -D script-loader (开发依赖,则为-d)安装完成后新建文件夹(static下)exportExcel在文件下载写入两个文件Blob.js和Export2Excel.jsBlob.js/* Blob.js * A Blob, File, FileReader &amp; URL implementation. * 2018-08-

数据变换的几种形式_diaodongqi2084的博客-程序员秘密

    数据变换主要是对数据进行规范化处理,达到适用于挖掘的目的。    简单的函数变换包括平方、开方、取对数查分运算等,可以将不具有正态分布的数据变换成具有正态分布的数据,对于时间序列分析,有时简单的对数变换和差分运算就可以将非平稳序列转换成平稳序列。数据规范化    1、最大——最小规范化 :X *=(x-min)/(max-min)      映射到 [0,1...

随便推点

SpringSecurity学习(一)_felix小康的博客-程序员秘密

学习目标:SpringSecurity学习学习内容:搭建 SpringSecurity项目环境自定义登录逻辑实现(添加配置类SecurityConfig,实例化PasswordEncoder,使用BCryptPasswordEncoder。实现UserDetailsService,返回UserDetails实现类User。)/** * @program: springsecutity-demo * @description: 配置类 * security要求,使用时要用passwo

实例学习ansible系列(7)常用模块之ping/setup_ansible只打印ping通设备_淼叔的博客-程序员秘密

知识点:ping模块,用于确认和对象机器之间是否能够ping通,正常情况会返回pong 知识点:setup模块,用于收集对象机器的基本设定信息。

STM32CubeMx: How to add your own “USER CODE BEGIN / END” section?_cubemx regenerate_LostSpeed的博客-程序员秘密

前言看到STM32CubeMX中没有考虑所有用户代码区标记。如果自己在官方规定的用户代码区外添加代码,当使用CubeMX重新生成代码时,会将自己手写的代码清掉。我自己想的方法是, 使用CubeMX前,备份工程,使用CubeMX后,用BC4合并代码到新工程。不过,一直再想,ST官方做的软件不可能这么寒蝉吧? 是不是有官方的方法可以添加自定义的用户代码区呢?今天查资料,看到这方面的确切资料。...

extjs 获取日期控件的值_Extjs的datefield怎么获取当前系统时间所属月月初到月末..._hs3113028的博客-程序员秘密

匿名用户1级2016-10-14 回答日期控件:new Ext.form.DateField( {fieldLabel : '开始日期',id : 'beginDate',width : 90,//value:sys.sysDate.substring(0,7)+'-01',value: timeYesterday,format:'Y-m-d',allowBlank : true,listener...

百度大脑 EasyDL 专业版最新上线自研超大规模视觉预训练模型_CSDN资讯的博客-程序员秘密

在学习与定制AI模型的过程中,开发者会面对各种各样的概念,在深度学习领域,有一个名词正在被越来越频繁地得到关注:迁移学习。它相比效果表现好的监督学习来说,可以减去大量的枯燥标注过程,简单...

Vue http转换https_AAA_86的博客-程序员秘密

在quasar.config文件中开启https devServer: { https:true, port: 8081, open: false , // opens browser window automatically proxy: { '/template': { target: 'https://192.168.101.61:8080', changeOrigin: true,