`

[原]向MySQL数据库插入Blob数据的问题

阅读更多
[标题]:向MySQL数据库插入Blob数据的问题
[时间]:2009-6-3
[摘要]:在使用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写入的图片数据换成文本,却可以正常写入。可见,是二进制数据的编码问题。

[解决]:
    将原来的数据连接:
<property name="connection.url">
    jdbc:mysql://localhost:3306/db
</property>
    修改成:
<property name="connection.url">
    <![CDATA[jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8]]>
</property>
    注意,在将连接字符串放到CDATA中,因为&是XML中的转义字符。不然会提示错误:
    Error parsing XML: /hibernate.cfg.xml(12) The reference to entity "characterEncoding" must end with the ';' delimiter.

    也可以直接把&修改为&amp;
    即:
    jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=utf-8

[参考资料]:
Mysql 中的blob相关问题 : http://fenghuang.iteye.com/blog/363931
分享到:
评论
1 楼 yoin528 2011-01-13  
useUnicode=true&amp;characterEncoding=UTF-8

在xml文件里面好像对;敏感,要转换一下。

相关推荐

    向数据库插入blob数据实例源码--在mysql中通过

    Blob(Binary Large Object)在数据库中用于存储二进制大对象,如图片、音频或视频文件等...源码中可能包含了类似的实现,通过解压提供的"向数据库插入blob数据实例源码"压缩包,你可以查看并运行完整的Java代码示例。

    jsp操作mysql数据库的blob字段

    在这个场景中,我们关注的是如何使用Java Server Pages(JSP)来操作MySQL数据库中的Blob(Binary Large Object)字段,这是一个用于存储大容量二进制数据如图片、文档或音频文件的特殊字段类型。以下是关于这个主题...

    利用VB存取数据库中BLOB数据

    在处理数据库中的BLOB(Binary Large Object)数据时,VB提供了丰富的功能。BLOB类型通常用于存储非结构化的数据,如图片、音频、视频或者任何二进制文件。以下将详细讲解如何利用VB来存取数据库中的BLOB数据。 ...

    mysql oracle 插入blob数据实例源码

    本篇文章将深入探讨如何在MySQL和Oracle数据库中插入Blob数据,并提供相关的源码实例。 一、MySQL中的Blob数据插入 MySQL提供了多种方式插入Blob数据,包括使用PreparedStatement接口。以下是一个Java源码示例: ...

    QT-Mysql-Blob.zip_mysql blob_qt blob 文件_qt blob类型_qt的blob

    以下是一个简单的示例,展示了如何在Qt中插入BLOB数据到MySQL: ```cpp // 假设已连接到MySQL数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName(...

    oracle中的BLOB(照片)转换到mysql中

    3. **上传至MySQL**:将本地照片文件上传到MySQL数据库。首先,创建一个包含BLOB字段的新表或者更新已有表结构。例如: ```sql CREATE TABLE mysql_photos ( id INT PRIMARY KEY, photo BLOB ); ``` 然后,...

    mysql导出工具(blob字段)

    mysql导出工具,可导出无注释插入语句,表中字段有blob类数据,插入语句前还有锁表操作语句,适合多种场景

    实现blob类型数据上传至MySQL数据库.rar

    在这种情况下,`BLOB`(Binary Large Object)数据类型是MySQL数据库用来存储大对象的理想选择。本文将详细介绍如何在JSP页面上实现`BLOB`类型数据的上传,并将其存储到MySQL数据库中。 首先,理解`BLOB`类型:`...

    MySQL数据库备份和恢复

    ### MySQL数据库备份与恢复:深度解析与实践指南 在当今数据驱动的世界中,数据库的稳定性和数据的安全性显得尤为重要。MySQL作为全球最流行的开源关系型数据库管理系统之一,其备份和恢复策略是确保数据安全和系统...

    Delphi 如何将二维数组数据 以Blob 存入数据库中 并读取 工程

    在本场景中,我们将探讨如何在 Delphi 中将二维数组数据转换为 Blob 数据,然后存入 MySQL 数据库,并从数据库中读取出来。 首先,我们需要了解 Delphi 中的二维数组和 Stream 对象的概念。二维数组是多个一维数组...

    利用spring的jdbcTemplate处理blob、clob

    spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。

    c# MySql数据库存储图片

    在C#编程环境中,与MySQL数据库进行交互是常见的任务,特别是在需要存储非结构化数据如图片时。本示例将详细介绍如何使用C#连接到MySQL数据库,并实现图片的存储功能。 首先,确保你已安装了MySQL数据库服务器以及...

    mysql_blob_tools

    `mysql_blob_tools`是一个针对MySQL数据库中Blob类型数据进行分析和统计的工具。它可以帮助用户处理和理解存储在Blob字段中的大量非结构化数据。 Blob类型在MySQL中有四种变体:TinyBlob、Blob、MediumBlob和...

    mysql,blob格式存储图片事例,商品展示页面

    本案例聚焦于使用MySQL数据库来存储商品图片,这是很多在线商店常见的做法。MySQL是一个流行的关系型数据库管理系统,因其高效、稳定和易于使用而备受青睐。在这个事例中,我们将深入探讨如何使用BLOB(Binary Large...

    图片BASE64加密保存到数据库Blob类型中(放入数据库,并取出生成图片)

    5. **数据库操作**:在数据库中插入和检索Blob类型的字段,通常需要使用SQL语句或者ORM框架。例如,使用Java的JDBC API,可以创建PreparedStatement来执行INSERT语句,然后使用OutputStream将BASE64解码后的字节数组...

    Mysql的longblob字段插入数据问题解决

    在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M。 想改变这个问题,需要注意几点: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (2054817 &gt; ...

    Mysql Blob的读取与插入

    Java中 Blob的插入与读取

    mysql数据库cmd命令大全

    5. 插入表数据:使用 `insert into &lt;表名&gt; [( &lt;字段名 1&gt;[,..&lt;字段名 n &gt; ])] values ( 值 1 )[, ( 值 n )];` 命令。 6. 导出一个表:使用 `mysqldump -u 用户名 -p 数据库名 表名 &gt; 导出的文件名;` 命令。 7. 查询...

    安卓进行照片在mysql云数据库端读取

    5. **上传照片**:将字节数组作为BLOB插入到MySQL数据库的相应表中。使用SQL INSERT语句,将照片数据与其他字段一起插入。 6. **从数据库下载**:当需要从数据库下载照片时,发送一个查询请求,获取照片的二进制...

    VC++6.0 MFC使用ODBC链接MySQL把图片写入blob字段

    本项目以VC++6.0 MFC为基础,结合ODBC(Open Database Connectivity)技术,实现了将图片数据存储到MySQL数据库的BLOB(Binary Large Object)字段中。下面将详细讲解这个过程涉及的知识点。 首先,理解ODBC。ODBC...

Global site tag (gtag.js) - Google Analytics