mysql存图片麻烦吗 用什么字段存

mysql存图片麻烦吗 用什么字段存,第1张

方法一:

把照片放进数据库,照片的格式最好是bmp,这样就可以在窗体上显示出来,不过这样数据库的体积会暴增。

详细的使用方法请参考Access帮助中的 PictureData 属性(本文末尾有相关帮助)。

而且,你可以直接用 commdlg API 函数来给图像框赋值,然后直接读取某个图像框的 PICTUREDATA 并存储到某个 IMAGE 字段中。这样做的优点是显示、读取方便,缺点是如果精度高,占用的硬盘空间会爆大。

详细示例请参考:

>

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 来存放的例子,总的来说有以下三点:

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

使用不易

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

问题一:数据库怎样可以将放到里面 首先肯定一点,数据库中是可以放数据的!但是这样的话,数据体积会很庞大,当然最好还是把放到文件夹中,数据只用来存放路径,不过最好是存放相对路径,应该以后可能设计到单独放在另一台服务器上,或换了文件夹。

问题二:SQL数据库中能存照片吗? 完全可以存放,但是在数据库中不能以select from a进行查询

但是在相对应得c#、Java中可以查询

是以二进制保存的。

数据库,只要是抽象出来的数据,都可以保存。

而已不能保存的,就是实体,像处啊、鞋子啊、男朋友啊都不姓

问题三:mysql数据库可以存吗? 可以。存的列需要设置成BLOB、MEDIUMBLOB或LONGBLOB等数据类型。

但是以前基本上不会把直接存在数据库里,因为数据库里的数据是为了用来快速分析、快速存取的,数据在mysql里既不能建立索引也不能和其他数据一起分析,存取速度和读写磁盘也没什么区别,每次备份、导入导出数据库时还增加了数据量,降低了效率。所以一般都是把存在系统里,然后把的存放路径放在数据库里。

问题四:如何存入数据库 第一种方式:保存路径至数据库中

第二种方式:数据插入相应表中,参数类型为byte[]

例如:

sql:insert into table(imageColumn) values (@image);

其中@image参数值为byte[]类型的变量

问题五:如何存放在oracle数据库 测试可行。这只是核心Class文件代码,你要是弄不出来,就再联系我,我再把整个项目给你。这是把真个放到数据库

package dao;

import javaioFileInputStream;

import javaioOutputStream;

import javasqlBlob;

import javasqlConnection;

import javasqlPreparedStatement;

import javasqlResultSet;

import javautilScanner;

import oraclesqlBLOB;

public class Insert {

Scanner sc =new Scanner(Systemin);

@SuppressWarnings(deprecation)

public int insertbinary(String pname,String src1){

Connection con = null;

String sql = insert into test values(,);

String sql1 =update test set image= where pname=;

int res = 0;

try {

con=BaseDAOgetConnection();

consetAutomit(false);

PreparedStatement pstm = conprepareStatement(sql);

pstmsetString(1, pname);

EMPTY_BLOB和EMPTY_CLOB返回一个空的LOB定位器,

可以用来初始化一个LOB变量,或在INSERT或UPDATE语句,

初始化LOB列或属性为空。 EMPTY表示LOB初始化,但不填充数据。

pstmsetBlob(2, oraclesqlBLOBempty_lob());

pstmexecuteUpdate();

pstmclose();

pstm = conprepareStatement(select from test where pname=);

pstmsetString(1, pname);

ResultSet rs = pstmexecuteQuery();

rsnext();

BLOB blob = (BLOB) rsgetBlob(2);

OutputStream os = blobgetBinaryOutputStream();

FileInputStream fi = new FileInputStream(src1);

byte[] buff = new byte[1024];

int len = firead(buff);

while (len != -1) {

oswrite(buff);

len = firead(buff);

}

pstm = conprepareStatement(sql1);

pstmsetBlob(1,>>

问题六:如何将储存在MySQL数据库里 通常对用户上传的需要保存到数据库中。解决方法一般有两种:一种是将保存的路径存储到数据库;另一种是将以二进制数据流的形式直接写入数据库字段中。以下为具体方法:

一、保存的上传路径到数据库:

string uppath=;用于保存上传路径

获取上传的文件名

string fileFullname = thisFileUpload1FileName;

获取上传的时间,以时间作为的名字可以防止重名

string dataName = DateTimeNowToString(yyyyMMddhhmmss);

获取的文件名(不含扩展名)

string fileName = fileFullnameSubstring(fileFullnameLastIndexOf(\\) + 1);

获取扩展名

string type = fileFullnameSubstring(fileFullnameLastIndexOf() + 1);

判断是否为要求的格式

if (type == bmp || type == jpg || type == jpeg || type == gif || type == JPG || type == JPEG || type == BMP || type == GIF)

{

将上传到指定路径的文件夹

thisFileUpload1SaveAs(ServerMapPath(~/upload) + \\ + dataName + + type);

将路径保存到变量,将该变量的值保存到数据库相应字段即可

uppath = ~/upload/ + dataName + + type;

}

二、将以二进制数据流直接保存到数据库:

引用如下命名空间:

using SystemDrawing;

using SystemIO;

using SystemDataSqlClient;

设计数据库时,表中相应的字段类型为iamge

保存:

路径

string strPath = thisFileUpload1PostedFileFileNameToString ();

读取

FileStream fs = new SystemIOFileStream(strPath, FileModeOpen, FileAccessRead);

BinaryReader br = new BinaryReader(fs);

byte[] photo = brReadBytes((int>>

问题七:如何在数据库中存储文件 解决方法一般有两种:

一种是将保存的路径存储到数据库;

另一种是将以二进制数据流的形式直接写入数据库字段中。

问题八:如何将存到数据库 通常对用户上传的需要保存到数据库中。解决方法一般有两种:一种是将保存的路径存储到数据库;另一种是将以二进制数据流的形式直接写入数据库字段中。以下为具体方法:

一、保存的上传路径到数据库:

string uppath=;用于保存上传路径

获取上传的文件名

string fileFullname = thisFileUpload1FileName;

获取上传的时间,以时间作为的名字可以防止重名

string dataName = DateTimeNowToString(yyyyMMddhhmmss);

获取的文件名(不含扩展名)

string fileName = fileFullnameSubstring(fileFullnameLastIndexOf(\\) + 1);

获取扩展名

string type = fileFullnameSubstring(fileFullnameLastIndexOf() + 1);

判断是否为要求的格式

if (type == bmp || type == jpg || type == jpeg || type == gif || type == JPG || type == JPEG || type == BMP || type == GIF)

{

将上传到指定路径的文件夹

thisFileUpload1SaveAs(ServerMapPath(~/upload) + \\ + dataName + + type);

将路径保存到变量,将该变量的值保存到数据库相应字段即可

uppath = ~/upload/ + dataName + + type;

}

二、将以二进制数据流直接保存到数据库:

引用如下命名空间:

using SystemDrawing;

using SystemIO;

using SystemDataSqlClient;

设计数据库时,表中相应的字段类型为iamge

保存:

路径

string strPath = thisFileUpload1PostedFileFileNameToString ();

读取

FileStream fs = new SystemIOFileStream(strPath, FileModeOpen, FileAccessRead);

BinaryReader br = new BinaryReader(fs);

byte[] photo = br>>

问题九:怎样数据库access保存jpg 只有两种方法

1存地址,放服务器的一个文件夹里

2存的数据,也就是二进制流

既然第一种你说不行 那只能第二种了。

我只说一下思路,代码网上找一下,多的很,也不麻烦1数据库字段类型为image(sqlserver的是image,不知道access的是不是)

2把文件序列化 放到一个byte[]数组里,然后存到数据库

显示的时候:

1单独在一个页面读出的内容到一个byte[]数组

2用response把这段二进制输出

3在要引用的地方,比如你的image控件,把引用的地址指向这个页面就行了

问题十:如何像数据库中保存? 一般图像是不保存在数据库的而是先将放在工程下的某个文件夹中,将所在的工程文件路径存在数据库中,当程序加载的时候,从数据库中读取的路径,然后根据路径在工程的文件夹中读取文件

一般的做法是,放在网站的一个目录里,如/image,

存储就是存储所在网站的路径,譬如:

有一个是ajpg,它在根目录下的image文件夹里,那么它的路径就是/image/ajpg,把这个路径存在

数据库中。读取内容时,吧这个路径赋值给<img>的src属性即可

以上就是关于mysql存图片麻烦吗 用什么字段存全部的内容,包括:mysql存图片麻烦吗 用什么字段存、MySQL里存储图片的是什么数据类型、数据库能存图片吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10183150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存