该文只介绍了BLOB操作、稍后会有TEXT的操作文章。

chf@tsinghua.org.cn

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编码的问题,于是将原来的连接字符串设置为:

Java代码

url=url++"?useUnicode=true&characterEncoding=utf-8";

url=url++"?useUnicode=true&characterEncoding=utf-8";

问题解决了,不仅能支持各种格式的文件,图片也显示正常了。如果设置为其他的字符集就会出现前面的错误。

四、max_allowed_packet参数设置

往数据库中存储较大的文件是出现如下错误:

Java代码

java.lang.IllegalArgumentException: Packet is larger than max_allowed_packet from server configuration of1048576bytes

java.lang.IllegalArgumentException: Packet is larger than max_allowed_packet from server configuration of 1048576 bytes

这是因为存入的文件大于mysql默认的 max_allowed_packet值。

解决办法:在mysql安装目录下的my.ini文件中的最后一行添加

Java代码

max_allowed_packet = 10M(也可以设置自己需要的大小)。

max_allowed_packet = 10M(也可以设置自己需要的大小)。

五、效率问题

利用数据库存储大量文件时,查询效率就会变得很低。

在表的设计上,我们可以选择吧文件的相关信息存在一个表中fileInfo,而吧文件内容存在另一个表中

fileContent,fileContent中有一个指向fileInfo的外键。这样,查询的时候只需要访问fileInfo,只有当要访问某个文件具体内容的时候才访问fileContent表。分表存储,能够显著提高查询速度。

-----------------------------

向MySQL数据库插入Blob数据的问题

[摘要]:在使用Hibernate向数据库插入Blob二进制数据时,发生如下错误:SQL

Error: 1064, SQLState: 42000 。You have an error in your SQL syntax; check the

manual that corresponds to your MySQL server version for the right syntax to use

near '??^5b??08""199G?"0Px8=?ü??Y??ó??l%P?[

¨???ó`-??F????:???S?a?@??Zu??' at

line

1

[关键字]:MySQL、Blob、图片、image、java、Hibernate、Clob、&

[环境]:5.1.34-community

MySQL Community Server (GPL),Hibernate 3.2.5

[作者]:Winty (wintys@gmail.com)

http://www.blogjava.net/wintys

[错误]:

使用Hibernate向数据库插入Blob二进制数据,程序如下:

public void insert() {

User user = new User();

Transaction tc = null;

try{

Session session =

HibernateUtil.getSession();

tc = session.beginTransaction();

user.setName("The Name");

FileInputStream fin = new

FileInputStream("rc/redheart.gif");

Blob image = Hibernate.createBlob(fin);

user.setImage(image);

File file = new File("rc/news.txt");

FileReader fr = new FileReader(file);

BufferedReader br = new

BufferedReader(fr);

Clob info = Hibernate.createClob(br , (int)file.length());

user.setInfo(info);

session.save(user);

tc.commit();

}catch(Exception

e){

if(tc !=

null){

tc.rollback();

}

System.err.println(e.getMessage());

}finally{

HibernateUtil.closeSession();

}

}

发生如下错误:

Hibernate: insert into db.myblobclob (name, image, info, id) values (?, ?,

?, ?)

00:33:45,671  WARN JDBCExceptionReporter:77 - SQL Error: 1064,

SQLState: 42000

00:33:45,671 ERROR JDBCExceptionReporter:78 - You have an

error in your SQL syntax; check the manual that corresponds to your MySQL server

version for the right syntax to use near

'??^5b??08""199G?"0Px8=?ü??Y??ó??l%P?[

¨???ó`-??F????:???S?a?@??Zu??' at line

1

00:33:45,687 ERROR AbstractFlushingEventListener:301 - Could not

synchronize database state with

session

org.hibernate.exception.SQLGrammarException: Could not execute JDBC

batch update

at

org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)

at

org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at

org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)

at

org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)

at

org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)

at

org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)

at

org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)

at

org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)

at

org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)

at

org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)

at

wintys.hibernate.blobclob.UserDAOBean.insert(UserDAOBean.java:41)

at wintys.hibernate.blobclob.UserTest.main(UserTest.java:18)

Caused by:

java.sql.BatchUpdateException: You have an error in your SQL syntax; check the

manual that corresponds to your MySQL server version for the right syntax to use

near '??^5b??08""199G?"0Px8=?ü??Y??ó??l%P?[

¨???ó`-??F????:???S?a?@??Zu??' at

line 1

at

com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)

at

com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)

at

org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)

at

org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)

... 9 more

Could not execute JDBC batch update

Hibernate: select

user0_.id as id0_, user0_.name as name0_, user0_.image as image0_, user0_.info

as info0_ from db.myblobclob user0_

[原因]:

搜索了一下,错误原因可能为:"在定义字段时,不要和MYSQL的保留字段有相同的"。

检查了一下表中的字段名,没有发现问题:

CREATE TABLE myblobclob(

id          VARCHAR(100) NOT

NULL,

name

VARCHAR(100),

image

BLOB,

info

TEXT,

PRIMARY KEY(id)

);

如果把Blob相关的程序注释了,Clob数据能够正常写入。原因当然出在Blob数据的写入程序中。后来发现,把Blob写入的图片数据换成文本,却可以正常写入。可见,是二进制数据的编码问题。

[解决]:

将原来的数据连接:

jdbc:mysql://localhost:3306/db

修改成:

注意,在将连接字符串放到CDATA中,因为&是XML中的转义字符。不然会提示错误:

Error

parsing XML: /hibernate.cfg.xml(12) The reference to entity "characterEncoding"

must end with the ';' delimiter.

也可以直接把&修改为&

即:

jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8

python mysql blob_Mysql的BLOB操作相关推荐

  1. python mysql数据库_Python3中操作MySQL数据库

    0.安装 pip install pymysql 1.打开数据库连接 import pymysql db = pymysql.connect(host="数据库地址", user= ...

  2. python使用mysql实例教程_Python操作Mysql实例代码教程在线版(查询手册)_python

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发 MySQL-python Windows下EXE安装文件下载 复制代码 代码如下: # -*- coding ...

  3. python mysql操作_Python的MySQL操作

    Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库. Python DB-API使用流程: 引入API模块. 获取与数据库的连接. 执行SQL ...

  4. python mysql工具类_Python工具类(一)—— 操作Mysql数据库

    如何调用直接看__main__函数里如何调用此工具类就阔以啦! # encoding=utf-8 import pymysql # 导入所有Mysql配置常量,请自行指定文件 from conf.se ...

  5. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库. 与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要 ...

  6. Python --链接MYSQL数据库与简单操作 含SSH链接

    项目是软硬件结合,在缺少设备的情况,需要通过接口来模拟实现与设备的交互,其中就需要通过从数据库读取商品的ID信息 出于安全考虑  现在很多数据库都不允许通过直接访问,大多数是通过SSH SSH : 数 ...

  7. 用Python+Mysql+MDUI实现的数据库增删改查列表操作及单,多文件上传实例

    用Python+Mysql+MDUI实现的数据库增删改查列表操作及单,多文件上传实例.web服务用flask框架,数据库操作用的pymysql框架.教程在我B站有的. 开源地址:https://git ...

  8. 【python MySQL 笔记】python和MySQL交互、操作

    [python MySQL 笔记]python和MySQL交互.操作 目录 1. 数据准备 2.  SQL演练 2.1 SQL语句强化练习 2.2. 将一个表拆为多个表 3. python操作MySQ ...

  9. Python MySQL 回滚 操作

    Python MySQL 回滚的使用 首先先创建两个表: 表类型要为INNODB 格式. CREATE TABLE IF NOT EXISTS T_USER(USER_ID INT(11) NOT N ...

最新文章

  1. 三本+双非拿到小米offer,我的经验总结
  2. linux uefo引导 win_基于UEFI和GPT模式下U盘安装windows8.1和Linux双启动教程
  3. BZOJ3298[USACO 2011Open]cow checkers——威佐夫博弈
  4. Eclipse JAVA项目的 目录结构 和 导入 import菜单使用
  5. c语言学习-编程实现以下功能,读入两个数(d1,d2)和一个运算符(o),计算d1 o d2的值
  6. 第一类丢失更新和第二类丢失更新是什么 区别
  7. shell 强制覆盖文件夹_如何强制robocopy覆盖文件
  8. 基于树莓派的AirPlay功能实现
  9. esp8266网页控制RGB灯颜色
  10. 程序员如何缓解眼睛疲劳酸痛症状?
  11. swifty项目中pod的使用
  12. dd指令打包iso文件 linux_Linux_如何在Linux操作系统下创建ISO镜像文件,1、用dd命令#dd if=/dev/cdrom - phpStudy...
  13. GTX1650 搭建TensorFlow-GPU 2.4框架(CUDA11.0 + cudnn 8.04 + anaconda 3.8)
  14. remix使用_使用Remix展平合同和调试
  15. Node-RED使用指南:6:配置与设定总结:运行环境配置
  16. android ubuntu网络,Android手机利用USB共享网络通过Ubuntu连接网络
  17. git push origin master和git push有什么区别
  18. linux回到命令首字符,Linux 命令词典选段
  19. 27、*(类和对象)现有电视商品价格竞猜活动。 项目需求:随机出现一个商品名,用户猜测它的价值 规定次数4次,猜对便可获得此商品。
  20. 《TIME》2008年50个最佳网站

热门文章

  1. 基于Vue和SpringBoot的超市账单管理系统的设计和实现
  2. 小孩子患有弱视,会因为随着年龄长大而自愈吗?
  3. android播放视频控件,视频播放控件VideoView的基本使用
  4. 华为交换机关闭网口_华为交换机常用命令 - 系统管理 - 最新IT资讯_电脑知识大全_网络安全教程 - 次元立方网...
  5. 2450 Problem B 树的高度
  6. office2007中公式编辑器
  7. vue安装Postcss_Flask和Vue.js构建全栈单页面web应用【通过Flask开发RESTful API】
  8. Gatsby精粹,面向未来的blog
  9. 什么叫数据库?它分为几类?是按照什么划分的?
  10. C语言项目PPT演示,C语言项目编程.ppt