一、MySQL BLOB 类型介绍
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob),除了在存储的最大信息量上不同外,他们是等同的。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255B
Blob 最大 65K //我的不是这个大小啊,也许设个是以前的吧
MediumBlob 最大 16M
LongBlob 最大 4G
实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果你存储的文件过大,数据库的性能会下降很多。
二、mysql中的blob存取
create table Dish {
int id;
blob photo;
};
下面是从数据库里写的方法:
String filepath = (String)session.getAttribute("file");//这里获得的是用jspsmartupload上传的文件的路径
File file = new File(filepath);
FileInputStream fin = new FileInputStream(file);
dataBS = new blobConn();
con = dataBS.getConn();
String erpsql = "insert into Dish values(?,?)";
PreparedStatement stmt = con.prepareStatement(erpsql);
stmt.setString(2,String.valueOf(id));
stmt.setBinaryStream(3,fin,(int)file.length());//想数据库里插入是很简单的,就一行,但这种方法只有mysql可以用
stmt.executeUpdate();
fin.close();
stmt.close();
con.close();
下面是从数据库里读的方法:
1.BufferedInputStream inputimg = null;
try {
Connection con = sqlDS.getConnection();//简写,获得数据库连接
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select from Dish where id = 11");
if(rs.next()){
java.sql.Blob blob = (java.sql.Blob)rs.getBlob("photo");
input = new BufferedInputStream(blob.getBinaryStream);
}
BufferedImage image = null;
image = javax.imageio.ImageIo.read(input);
ServlerOutputStream sos = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);
encoder.encode(image);
input.close();
}catch(Exception e) {
e.printStackTrace();
}
2.
if(rs.next()){
res.setContentType ("image/jpeg;charset=GB2312");//HttpServletResponse res
ServletOutputStream out = res.getOutputStream ();
BufferedInputStream jpgData = new BufferedInputStream (rs.getBinaryStream ("photo"));
byte [] buf = new byte [4*1024];
int len;
if(jpgData.available () <= 0x0)//判断数据库里存放图片的字段是否有值,可以进行其他处理
res.sendRedirect ("/images/nophoto.gif");
while((len = jpgData.read (buf, 0, buf.length)) != -1)
out.write (buf, 0, len);
}
3.
if(rs.next()){
res.setContentType("image/jpeg");
ServletOutputStream out=res.getOutputStream();
InputStream in=rs.getBinaryStream("photo");
byte buff[]=new byte[1024];
int i;
while((i=in.read(buff))!=-1){
out.write(buff);
}
in.close();
out.close();
}
三、charset设置对blog操作的影响
存储txt文件的时候没有问题;存储图片也没问题,但是再把图片图片从数据库中取出来,不能正常显示了;存储word格式的文件报错,如下:
Caused by: java.sql.BatchUpdateException: Syntax error or access violation message from server: "You have an error in your SQL syntax near ''D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000' at line 1"
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1540)
查了一下可能是charset编码的问题,于是将原来的连接字符串设置为:
- url=url++"?useUnicode=true&characterEncoding=utf-8";
问题解决了,不仅能支持各种格式的文件,图片也显示正常了。如果设置为其他的字符集就会出现前面的错误。
四、max_allowed_packet参数设置
往数据库中存储较大的文件是出现如下错误:
- <strong>java.lang.IllegalArgumentException: Packet is larger than max_allowed_packet from server configuration of 1048576 bytes</strong>
这是因为存入的文件大于mysql默认的 max_allowed_packet值。
解决办法:在mysql安装目录下的my.ini文件中的最后一行添加
- max_allowed_packet = 10M(也可以设置自己需要的大小)。
五、效率问题
利用数据库存储大量文件时,查询效率就会变得很低。
在表的设计上,我们可以选择吧文件的相关信息存在一个表中fileInfo,而吧文件内容存在另一个表中fileContent,fileContent中有一个指向fileInfo的外键。这样,查询的时候只需要访问fileInfo,只有当要访问某个文件具体内容的时候才访问fileContent表。分表存储,能够显著提高查询速度。
-------------------------------------------------------------------------------------------------
CLOB类型默认为1m 如果大于的话可能会出现
Packet for query is too large (37748784 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable
异常 这是可以在
[mysqld]下面添加 max_allowed_packet=10M来扩大限制
在 jdk 6。0 以前 向数据库插入clob 和blob数据的操作方法:
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length)方法
而在jdk 6.0以后就可以用
void setClob(int parameterIndex, Reader reader)
void setBlob(int parameterIndex, InputStream inputStream)方法来插入clob/blob
读取时候可以用读取流来处理或者用:
clob的时候可以
用 Clob.getSubString(pos, length)不过length是个int型的
或者用
- Clob c = rs.getClob("clumn");
- StringBuffer a = new StringBuffer(1024);
- Reader r = c.getCharacterStream();
- char[] cc = new char[1];
- int i = -1;
- while((i =r.read(cc))!=-1){
- a.append(cc);
- }
读取blob可以用:
Blob b = rs.getBlob("clumn");
java.io.InputStream getBinaryStream ()或者getBytes(pos, length)
分享到:
相关推荐
而在MySQL中,BLOB也有类似的分类,包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,分别适用于不同大小的二进制数据。 从Oracle中提取BLOB照片的步骤如下: 1. **查询BLOB数据**:使用SQL查询语句从Oracle数据库中...
当我们需要在MySQL数据库中处理大对象(Binary Large Object,简称BLOB)时,如图片、音频或视频等非文本数据,就需要结合MySQL和Qt来完成。下面我们将详细讨论如何在MySQL和Qt环境下对BLOB数据类型进行操作。 首先...
本教程将深入探讨如何在Java环境下,批量地从MySQL数据库中下载存储在Blob字段中的图片,并将其保存到本地文件系统。 首先,我们需要理解Blob类型。Blob是MySQL中的一个数据类型,用于存储大量二进制数据。它分为四...
"MySQL 中的 BLOB 到文件的转换" 在 MySQL 数据库中,BLOB(Binary Large OBject)是一种二进制大对象类型,常用于存储图像、音频、视频和其他类型的文件。然而,在实际应用中,我们经常需要将 BLOB 数据转换为文件...
基于存储过程的MySQL数据库BLOB字段访问是指在MySQL数据库中使用存储过程来访问和处理二进制数据的方法。这种方法可以使得数据库的二进制数据处理变得更加方便和高效。 MySQL数据库提供了BLOB数据类型,可以用来...
`mysql_blob_tools`是一个针对MySQL数据库中Blob类型数据进行分析和统计的工具。它可以帮助用户处理和理解存储在Blob字段中的大量非结构化数据。 Blob类型在MySQL中有四种变体:TinyBlob、Blob、MediumBlob和...
mysql导出工具,可导出无注释插入语句,表中字段有blob类数据,插入语句前还有锁表操作语句,适合多种场景
1. **BLOB数据类型**:MySQL提供了四种不同类型的BLOB,包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们分别可以存储的最大数据量不同。根据商品图片的大小,选择合适的数据类型很重要,以确保空间的有效利用。 2....
在MySQL中,Blob类型字段常用于存储大块的非结构化数据。本实例将详细介绍如何在MySQL数据库中插入Blob数据,并提供源码示例。 1. **Blob类型介绍** MySQL中的Blob类型有四种变体:TinyBlob、Blob、MediumBlob和...
在这个场景中,我们关注的是如何使用Java Server Pages(JSP)来操作MySQL数据库中的Blob(Binary Large Object)字段,这是一个用于存储大容量二进制数据如图片、文档或音频文件的特殊字段类型。以下是关于这个主题...
mysql写入或读取一段数据块时,数据类型为blob型,本代码详细介绍在mysqll中如何读写blob格式数据
在MySQL数据库中,Blob是一种特殊的数据类型,用于存储大量的二进制数据,如图片、音频文件或文档。Blob可以分为四种不同的子类型:TinyBlob、Blob、MediumBlob和LongBlob,每种类型根据能存储的最大数据量不同。这...
本篇文章将深入探讨如何在MySQL和Oracle数据库中插入Blob数据,并提供相关的源码实例。 一、MySQL中的Blob数据插入 MySQL提供了多种方式插入Blob数据,包括使用PreparedStatement接口。以下是一个Java源码示例: ...
本篇文章将深入探讨在使用Hibernate存储MySQL表中的BLOB(Binary Large Object)字段时可能遇到的问题以及解决策略。 BLOB类型在MySQL中用于存储大量的二进制数据,如图片、视频、文档等。Hibernate作为Java中的ORM...
MySQL中的BLOB类型是用于存储...总结来说,MySQL的BLOB类型是为了解决大数据存储问题,而PreparedStatement是Java中用来安全高效地操作BLOB字段的工具。正确理解和使用这些技术,对于处理大量的二进制数据至关重要。
Java中 Blob的插入与读取
在处理数据库中的BLOB(Binary Large Object)数据时,VB提供了丰富的功能。BLOB类型通常用于存储非结构化的数据,如图片、音频、视频或者任何二进制文件。以下将详细讲解如何利用VB来存取数据库中的BLOB数据。 ...
本项目以VC++6.0 MFC为基础,结合ODBC(Open Database Connectivity)技术,实现了将图片数据存储到MySQL数据库的BLOB(Binary Large Object)字段中。下面将详细讲解这个过程涉及的知识点。 首先,理解ODBC。ODBC...
本实例主要探讨如何利用Hibernate和Struts框架来处理MySQL数据库中的BLOB字段,实现文件的上传与下载功能。 **一、Hibernate框架** Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射...