在MySQL中Blob是一个二进制的对象,它是一个可以存储大量数据的容器(如图片,音乐等等),且能容纳不同大小的数据,在MySQL中有四种Blob类型,他们的区别就是可以容纳的信息量不容分别是以下四种:
①TinyBlob类型 最大能容纳255B的数据
②Blob类型 最大能容纳65KB的
③MediumBlob类型 最大能容纳16MB的数据
④LongBlob类型 最大能容纳4GB的数据
而在我们实际使用的时候,可以根据自己的需求选择这几种类型,但是如果Blob中存储的文件的大小过大的话,会导致数据库的性能很差。下面具体介绍一下插入Blob类型的数据以及读取Blob类型的数据的方式:
1、插入Blob类型的数据
插入Blob类型的数据时,需要注意必须要用PreparedStatement,因为Blob类型的数据是不能够用字符串来拼的,在传入了SQL语句后,就需要去调用PreparedStatement对象中的setBlob(int index , InputStream in)方法来设置传入的的参数,其中index表示Blob类型的数据所对应的占位符(?)的位置,而InputStream类型的in表示被插入文件的节点流。
2、读取Blob类型的数据
读取Blob类型相对来说比较容易,当获取了查询的结果集之后,使用getBlob()方法读取到Blob对象,然后调用Blob的getBinaryStream()方法得到输入流,再使用IO操作进行文件的写入操作即可。
下面是具体例子来实现Blob类型数据的插入和读取操作:
现在本地数据库中有这样一个表animal,其中picture中存放的数据类型为MediumBlob类型
贴上自己试验的代码
# 向数据库插入数据
for i, key in enumerate(list(update_container.keys())):
value = update_container[key].value
value_str = value.tostring()
shape = value.shape
sql = 'insert into face_emb(uid, shape, emb) values (%s, %s, %s)'
test_mysql.executeSqlManyByConn(sql, [key, str(shape[0]), value_str])
# 从数据库读取数据,转换成需要格式
sql = 'select * from face_emb'
s = test_mysql.executeSqlByConn(sql)
print(s)
s1 = s.fetchall()
for i in range(len(s1)):
userid, shape, emb_bytes = s1[i]
tmb_list = np.fromstring(emb_bytes, dtype=np.float32)
emb = tmb_list.reshape(shape, -1)
print(emb.shape)
---------------------
作者:鲸鱼programmer
来源:CSDN
原文:https://blog.csdn.net/qq_38785658/article/details/75009700
版权声明:本文为博主原创文章,转载请附上博文链接!