怎么操作Blob类型的字段
1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob
(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法
都是错误的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,
发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。
根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:
1.新建记录,插入BLOB数据
1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:
insert xxxtable(A,B,C) values(empty_blob(),'xxx','yyyy')
1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:
conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.
1.3 查询刚才插入的记录,后面要加“ for update ”,如下:
select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked
的异常
1.4 从查询到的 BLOB字段中,获取blob并进行更新,代码如下:
BLOB blob = (BLOB) rs.getBlob("A");
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os);
后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:
BufferedInputStream input = new BufferedInputStream(new File("c://hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件写入的缓冲
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代码就是从input里2k地读取,然后写入到output中。
1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet
1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true); 改回Connction的属性
BLOB 字段是什么
在计算机中,BLOB是指二进制长对象。BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
什么是blob,mysql blob大小配置介绍
BLOB (binary large object)二进制象存储二进制文件容器计算机BLOB数据库用存储二进制文件字段类型BLOB
文件典型BLOB张图片或声音文件由于尺寸必须使用特殊式处理(例:传、载或者存放数据库)根据Eric Raymond
说处理BLOB主要思想让文件处理器(数据库管理器)理文件关何处理专家强调种处理数据象双
刃剑能引发些问题存储二进制文件使数据库性能降数据库存放体积较媒体象应用程序处理BLOB典型例
mysql BLOB类型
MySQLBLOB类型系列包括:TinyBlob、Blob、MediumBlob、LongBlob几类型间唯区别存储文件同
MySQL四种BLOB类型
类型 (单位:字节)
TinyBlob 255
Blob 65K
MediumBlob 16M
LongBlob 4G
什么是blob,mysql blob大小配置介绍
BLOB介绍
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一
个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。根据Eric Raymond的
说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双
刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
mysql BLOB类型
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
oracle中Blob和Clob类型的区别
BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的。其实两个是可以互换的的,或者可以直接用LOB字段代替这两个。但是为了更好的管理ORACLE数据库,通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。而像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便。
Oracle中Blob和Clob的作用?
BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。1、用Blob和Clob建立对象:(1)在存储的时候也同样的在PreparedStatement和CallableStatememt中,以参数的形式使用setBlob()和 setClob方法把Blob和Clob对象作为参数传递给SQL。这听起来似乎很简单对吧,但是并非我们想象的这样,很不幸由于这两个类型的特殊,JDBC并没有提供独立于数据库驱动的Blob和Clob建立对象。因此需要自己编写与驱动有关的代码,但这样又牵掣到移植性。这就要用到前面说过的思想了使用数据块进行写操作。(2)同样用PreparedStatement和CallableStatememt类,但参数的设置可以换为setAsciiStream、setBinaryStream、setCharacterStream、setObject(当然前3个同样存在长度的问题)(3)下面给大家个例子以方便大家理解:public void insertFile(File f) throws Exception{FileInputStream fis=new FileInputStream(f,Connection conn);byte[] buffer=new byte[1024]data=null;int sept=0;int len=0;while((sept=fis.read(buffer))!=-1){if(data==null){len=sept;data=buffer;}else{byte[] temp;int tempLength;tempLength=len+sept;temp=new byte[tempLength];System.arraycopy(data,0,temp,0,len);System.arraycopy(buffer,0,temp,len,sept);data=temp;len=tempLength;}if(len!=data.length()){byte temp=new byte[len];System.arraycopy(data,0,temp,0,len);data=temp;}}String sql="insert into fileData (filename,blobData) value(?,?)";PreparedStatement ps=conn.prepareStatement(sql);ps.setString(1,f.getName());ps.setObject(2,data);ps.executeUpdate();}
如何使用 Blob 存储
BLOB的存储和读取
创建测试表
SQL> create table alice.user_stats(
2 id number primary key,
3 username varchar2(4000),
4 app blob)
5 partition by range(id)
6 (partition part01 values less than(50),
7 partition part02 values less than(maxvalue))
8 /
创建directory
SQL> create directory bfile as '/oracle';
Directory created.
SQL> grant read,write on directory bfile to alice;
Grant succeeded.
存储blob
SQL> declare sfile bfile:=bfilename('BFILE','dotnetfx.exe');
2 length_file int :=dbms_lob.getlength(sfile); --得到文件长度
3 dfile blob; blob指针
4 begin
5 insert into alice.user_stats(id,app) values(10,empty_blob());
6 select app into dfile from alice.user_stats; --记录blob指针
7 dbms_lob.fileopen(sfile,dbms_lob.file_readonly); --以只读方式打开bfile模式的文件
8 dbms_lob.loadfromfile(dfile,sfile,length_file); --开始加载指定长度的文件到指针位置
9 dbms_lob.fileclose(sfile); --关闭
10 commit;
11 end;
12 /
读取blob
SQL> declare l_file utl_file.file_type;
2 l_buffer raw(32767);
3 l_amount binary_integer :=32767;
4 l_pos int :=1;
5 l_blob blob;
6 l_blob_length int;
7 begin
8 select app into l_blob from alice.user_stats where id=10;
9 l_blob_length:=dbms_lob.getlength(l_blob);
10 l_file :=utl_file.fopen('BFILE','dot.exe','wb',32767); --创建文件
11 while l_pos<l_blob_length loop
12 dbms_lob.read(l_blob,l_amount,l_pos,l_buffer); --循环读取blob到buffer
13
14 utl_file.put_raw(l_file,l_buffer,true); --刷新缓存到文件
15 l_pos:=l_pos+l_amount;
16 end loop;
17 utl_file.fclose(l_file); --关闭文件
18 end;
19 /
如何往mysql里面存blob
以下的文章主要介绍的是MySQLtext与blob字段类型的不同之处的比较,同时本文也有对MySQLtext与blob字段类型的实际应用的介绍,如果你对MySQLtext与blob字段类型相关的实际操作有兴趣的话,你就可以对以下的文章点击观看了。1.blob是二进制大对象,可以容纳可变量数量的数据,其中blob分为4中类型:TINYBLOB,BLOB,mediumblob和LongBlob,他们容纳的长度是不同的.Text同样也分为四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT2.blob被视为二进制字符串,Text被视为非二进制字符串;blob列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。在MySQLTEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告.在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。3.BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR.BLOB和TEXT列不能有默认值.当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同).对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的.LONG和LONGVARCHAR对应MEDIUMTEXT数据类型。这是为了保证兼容性。如果TEXT列类型使用BINARY属性,将为列分配列字符集的二元校对规则.MySQL连接程序/ODBC将BLOB值定义为LONGVARBINARY,将MySQLTEXT值定义为LONGVARCHAR。由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束.BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。例如,可以使用MySQL和MySQLdump来更改客户端的max_allowed_packet值.