MySQL里存储图片的是什么数据类型?
背景
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;
}
祝你成功!!!
0条评论