MySQL里存储图片的是什么数据类型?

MySQL里存储图片的是什么数据类型?,第1张

背景

MySQL 一直以来都有 TEXT、BLOB 等类型用来存储、视频等大对象信息。比如一张,随便一张都 5M 以上。视频也是,随便一部视频就是 2G 以上。

假设用 MySQL 来存放**视频等信息,一部是 2G,那么存储 1000 部就是 2TB,2TB 也就是 1000 条记录而已,但是对数据库性能来说,不仅仅是看记录数量,更主要的还得看占用磁盘空间大小。空间大了,所有以前的经验啥的都失效了。

所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了。数据库只关心怎么来的快,怎么来的小。

举例

虽然不推荐 MySQL 这样做,但是也得知道 MySQL 该怎么做才行,做到心里有数。比如下面一张微信,大概 5M 的样子。

root@ytt:/var/lib/mysql-files# ls -sihl 微信_20190711095019jpg274501 54M -rw-r--r-- 1 root root 54M Jul 11 07:17 微信_20190711095019jpg

拷贝 100 份这样的来测试

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信_20190711095019jpg "$i"jpg;done;

root@ytt:/var/lib/mysql-files# ls

100jpg   17jpg  25jpg  33jpg  41jpg  4jpg   58jpg  66jpg  74jpg  82jpg  90jpg  99jpg  f8tsv

10jpg    18jpg  26jpg  34jpg  42jpg  50jpg  59jpg  67jpg  75jpg  83jpg  91jpg  9jpg   微信_20190711095019jpg

1111jpg  19jpg  27jpg  35jpg  43jpg  51jpg  5jpg   68jpg  76jpg  84jpg  92jpg  f1tsv

11jpg    1jpg   28jpg  36jpg  44jpg  52jpg  60jpg  69jpg  77jpg  85jpg  93jpg  f2tsv

12jpg    20jpg  29jpg  37jpg  45jpg  53jpg  61jpg  6jpg   78jpg  86jpg  94jpg  f3tsv

13jpg    21jpg  2jpg   38jpg  46jpg  54jpg  62jpg  70jpg  79jpg  87jpg  95jpg  f4tsv

14jpg    22jpg  30jpg  39jpg  47jpg  55jpg  63jpg  71jpg  7jpg   88jpg  96jpg  f5tsv

15jpg    23jpg  31jpg  3jpg   48jpg  56jpg  64jpg  72jpg  80jpg  89jpg  97jpg  f6tsv

16jpg    24jpg  32jpg  40jpg  49jpg  57jpg  65jpg  73jpg  81jpg  8jpg   98jpg  f7tsv

我们建三张表,分别用 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 (000 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 (000 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 (000 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/mysqldsock -e "insert into ytttt_image1(image_file)

values (load_file('/var/lib/mysql-files/$ijpg'))";done;

tt_image2

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;

do mysql -S /var/run/mysqld/mysqldsock -e "insert into ytttt_image2(image_file)

values (hex(load_file('/var/lib/mysql-files/$ijpg')))";done;

tt_image3

root@ytt:/var/lib/mysql-files# aa='begin;';for i in `seq 1 100`;

do aa=$aa"insert into ytttt_image3(image_file) values

('/var/lib/mysql-files/$ijpg');";

done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqldsock -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 (000 sec)

看下文件大小,可以看到实际大小排名,LONGTEXT 字段存储的最大,LONGBLOB 字段缩小到一半,最小的是存储路径的表 tt_image3。所以这里从存储空间来看,存放路径最占优势。

root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image274603 11G -rw-r----- 1 mysql mysql 11G Jul 11 07:27 tt_image2ibd274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1ibd274605  80K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3ibd

那么怎么把取出来呢?

tt_image3 肯定是最容易的

mysql> select from tt_image3;+----+----------------------------+| id | image_file                 |+----+----------------------------+|  1 | /var/lib/mysql-files/1jpg |+----+----------------------------+100 rows in set (000 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 来存放的例子,总的来说有以下三点:

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

使用不易

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

压缩到想要的大小有这几种方法:PS、Word压缩、Excel压缩、PPT压缩、美图秀秀、秒会压缩大师

最推荐的一种:秒会压缩大师软件网页版

推荐理由:

模式压缩:可根据需求选择压缩模式(如缩小优先、清晰优先),并支持自定义设压缩的清晰度、分辨率、格式以及希望大小。

操作简单快速:可一次性上传多张需要压缩的文件,批量进行压缩处理,支持根据压缩前与压缩后的文件大小对比确认压缩结果是否符合预期效果,节约压缩的时间成本。

保障文件安全:压缩在线版对压缩过程进行了多重加密处理,并且在压缩完文件的30分钟后,便会将所有文件从服务器中永久删除,期间无人能查阅或下载这些文件,让你的文件与隐私得到保障。

支持多种格式::支持JPG、PNG、GIF、BMP等格式;视频:支持MP4、MKV、MOV、AVI、WMV、M4V、MPEG等视频格式;PDF:PDF文档均可压缩;Word:支持doc、docx等Word格式;PPT:支持ppt、pptx等PPT格式;

操作方法:

1、获取工具“秒会压缩大师”,选择操作

2、将自己需要压缩的添加到网页中,然后自动开始压缩

3、压缩完成后下载打开就可以是用的。

你在逗我,怎么可能直接用程序直接写入另一个服务器。

我的思路是(没有试验过)

转换为为二进制文件进行上传到另一个服务器进行处理保存

转换为base64 用curl请求服务器进行处理

模拟表单请求

腾讯微信用户超过9亿,每天产生的数据量都是数亿tb,马化腾在一次数博会上透露,腾讯保存着18年用户的数据,数据量超过1000个pb。就在前不久腾讯公司宣布它的用户已经突破九亿人。用户信息最久都已经保存了近二十年。为什么不论用户在何时何地打开软件都可以找到自己上传的信息,而且还能非常寻迅速的下载下来。这些功能都是如何实现的呢?

1,分布式云存储

据悉,腾讯是国内服务器最多的互联网公司,腾讯在全球部署了24个大区、44个集成数据中心、超过1400个CDN节点,2018年,天津数据中心,服务器就超过10万台。如此大的规模对日益增长的数据需求起到有力支撑,用户的数据根据地域分布在各个节点上,如此庞大的数据,都是通过大数据分布式存储,可不是传统的关系型数据库。

2,有些数据是不会存储在服务器上的

通过微信的数据并不是全部上传但服务器上的,比如:聊天记录(文字、语音、)等等,因为考虑到用户的隐私,以及数据存储问题,这些数据是存储在用户本地的,微信卸载删除,聊天记录就清空了,这些数据服务器上不保存。

而且,分布式存储也能起到很好的保密作用,除非经过用户的请求允许,不然是很难拿到用户的完整数据。因此完全可以。

首先,下载实用工具箱

选择工具

选择转链接

输入的地址并电机转换即可把本地生成链接

扩展资料:

如果要让其他手机访问该链接,需要上传到服务器,需要注意的是:

1、一般单独保存在服务器,地址存储在数据库,并且做适当压缩,以减小传送压力。

2、可以采用FTP 或tcp  等协议上传,一般使用js。

3、数据库保存主键ID,IIS服务器需要创建虚拟目录保存。

4、服务器目录需要开通外网访问(共享)读写的权利,不然会读写失败。

5、根据时间戳保存,并且有容错措施。

6、常用的格式是gif和jpg

JPG格式:该格式的优点在于文件比较小,比如一张88k的gif格式的转换为jpg格式,只有20几k。所以,要想使您的网站空间容纳更多的,可以采取上传jpg格式的。

7、不要重复上传

每上传一张,库中就会保留,如果在其它网页上传相同的,可以直接从库中上传。或者复制该,可以节省宝贵的空间。

//这是一个上传的例子,上传其他文件都一样

string strFileFullName = SystemIOPathGetFileName(thisFileUpload1PostedFileFileName);

if (strFileFullNameLength > 0)

{

if (FileUpload1HasFile)

{

string newFileName = GetNewFileName(strFileFullName);

string path = ServerMapPath("[服务器端存储的路径]" + newFileName);

string pathSaveImg = ServerMapPath("[服务器端存储的路径]" + newFileName);

thisFileUpload1SaveAs(path);

[数据库字段]= "[服务器端存储的路径]" + newFileName;

}

else

{

MessageBoxShow(this, "找不到此"); return;

}

}

//跟据文件名产生一个由时间+随机数组成的一个新的文件名

//因为客户端上传的文件很可能会重名,所以要对文件名进行重命名

public static string GetNewFileName(string FileName)

{

Random rand = new Random();

string newfilename = DateTimeNowYearToString() + DateTimeNowMonthToString() + "m" +

DateTimeNowDayToString() + "d"

+ DateTimeNowSecondToString() + DateTimeNowMinuteToString()

+ DateTimeNowMillisecondToString()

+ "a" + randNext(1000)ToString()

+ FileNameSubstring(FileNameLastIndexOf(""), FileNameLength - FileNameLastIndexOf(""));

return newfilename;

}

祝你成功!!!

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » MySQL里存储图片的是什么数据类型?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情