今天在使用Hibernate 4插入Clob,Blob类型数据到mysql时候 ,Hibernate报错,错误信息为
Data truncation: Data too long for column
一开始,我以为自己设置的参数有问题,看了下
port = 3306 #设置mysql的安装目录 basedir = D:\mysqlbase #设置mysql数据库的数据存放目录,必须是data或者\xxx-data datadir = D:\mysqlbase\data #设置服务器段的字符集 character_set_server = utf8 #thread_cache_size=100 #read_buffer_size=512K #record_buffer=16M #sort_buffer=16M max_allowed_packet = 20M
20M应该够了,我只是插了张900k左右的图片而已,Blob数据类型不是放很大的数据吗?
在谷歌之后,我发现我错了,可以看官方文档的说明。
BLOB[(M)] 最大长度为65,535(216–1)字节的BLOB列。 可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。 · TEXT[(M)] 最大长度为65,535(216–1)字符的TEXT列。 可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。 · MEDIUMBLOB 最大长度为16,777,215(224–1)字节的BLOB列。 · MEDIUMTEXT 最大长度为16,777,215(224–1)字符的TEXT列。 · LONGBLOB 最大长度为4,294,967,295或4GB(232–1)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。 · LONGTEXT 最大长度为4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存
也就是说Blob,Clob类型只能放65K的数据,longblob,longtext能放4G的数据。
所以正确的方式是修改类型为longblob,或者插入65k以下的数据。
附录:
我的最初的建表sql为:
CREATE TABLE `tsp_person` ( `id` int(3) NOT NULL AUTO_INCREMENT, `image` blob, `intro` text COLLATE utf8_bin, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
测试方法为:
public void saveTest2() throws Exception { Person person = new Person(); File file = new File("F:/saveFile/testhua.jpg"); FileInputStream fis = new FileInputStream(file); File file1 = new File("f:/saveFile/my_log.log"); Reader reader = new FileReader(file1); // 必须开启事务 Session session = HibernateUtil.openSession(); Transaction ts = session.beginTransaction(); person.setImage(session.getLobHelper().createBlob(fis, file.length())); person.setIntro(session.getLobHelper().createClob(reader, file1.length())); ts.commit(); baseDao.saveObject(person); }
工具类为:
public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { Configuration cfg = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build(); sessionFactory = cfg.buildSessionFactory(serviceRegistry); } catch (Throwable e) { throw new ExceptionInInitializerError(e); } } private HibernateUtil() { } public static SessionFactory getSessionFactory() { return sessionFactory; } /** * 获取session对象 * @return */ public static Session openSession(){ return sessionFactory.getCurrentSession(); } }
做的过程中参考了博文,原博文地址:
http://www.yihaomen.com/article/java/453.htm HibernateUtil工具类在hibernate3下与hibernate4下的区别 http://blog.csdn.net/yantingmei/article/details/18050341
全文完。
相关推荐
为了与MySQL的BLOB字段交互,我们需要使用QByteArray,这是一个可以存储任意字节序列的类。例如,如果你想插入一个图像文件到BLOB字段,你需要先将图像文件读入QByteArray,然后在SQL插入语句中使用这个数组。 以下...
"MySQL 中的 BLOB 到文件的转换" 在 MySQL 数据库中,BLOB(Binary Large OBject)是一种二进制大对象类型,常用于存储图像、音频、视频和其他类型的文件。然而,在实际应用中,我们经常需要将 BLOB 数据转换为文件...
MySQL是一个广泛使用的开源关系型数据库管理系统,它提供了对BLOB(Binary Large Object)类型的支持,用于存储大块二进制数据。本教程将深入探讨如何在Java环境下,批量地从MySQL数据库中下载存储在Blob字段中的...
TinyBlob可以存储最多255个字节,Blob可存储65,535个字节,MediumBlob能存储16,777,215个字节,而LongBlob则可以存储4,294,967,295个字节或更大。 在`mysql_blob_tools`中,`main.cpp`可能是一个C++源代码文件,...
在MySQL中,要创建一个包含Blob字段的表,可以使用以下SQL语句: ```sql CREATE TABLE BlobTable ( id INT AUTO_INCREMENT PRIMARY KEY, blobField BLOB ); ``` 这里我们创建了一个名为`BlobTable`的表,...
在这个例子中,我们创建了一个PreparedStatement,设置SQL语句的占位符,并使用setBinaryStream方法将图片文件转换为字节流,然后插入到数据库中。 二、Oracle中的Blob数据插入 Oracle数据库处理Blob数据的方法...
2. BLOB:最多可以存储2^16 - 1(65,535)个字节。 3. MEDIUMBLOB:最多可以存储2^24 - 1(16,777,215)个字节。 4. LONGBLOB:最多可以存储2^32 - 1(4,294,967,295)个字节。 在处理BLOB类型的字段时,由于其二...
- Blob数据量大时,读写可能会消耗大量内存,因此处理Blob时要注意性能优化,避免一次性加载整个Blob内容。 - Blob数据的生命周期管理也很重要,及时清理不再使用的Blob,以防止数据库空间浪费。 8. **示例代码...
`jsp1.rar_jsp blob_jsp 图片_mysql blob_图片 MySQL`这个标题和描述指向了一个具体的场景:使用JSP(JavaServer Pages)从MySQL数据库中读取存储为BLOB(Binary Large Object)类型的图片数据。 首先,我们来理解...
当需要从数据库中检索`BLOB`数据时,可以使用`ResultSet`获取`Blob`对象,然后将其转换为字节数组,最后保存或显示到客户端。 通过以上步骤,你就可以在JSP页面上实现`BLOB`类型数据的上传,并将其存储到MySQL...
2. **Blob**:适合稍大一些的二进制数据,最大可存储65,535字节(即64KB)。 3. **MediumBlob**:用于存储更大的文件,最多能容纳16,777,215字节(即16MB)。 4. **LongBlob**:针对非常大的二进制对象,可存储...
在IT领域,Blob(Binary Large Object)是一种用于存储大量二进制数据的数据类型,常见于数据库系统中,如MySQL。...同时,也要注意文件大小限制,因为Blob字段的大小受到数据库服务器配置的影响。
本文实例讲述了PHP操作MySQL中BLOB字段的方法。...Blob: 最大 65K MediumBlob:最大 16M LongBlob: 最大 4G 注意:如果你存储的文件过大,数据库的性能会下降很多。 2、PHP操作BLOB案例 (1)操作新
4. **保存BLOB数据**:将上传的文件转换为字节数组,赋值给`FileEntity`的`fileContent`属性,然后调用`Session`的`save()`或`saveOrUpdate()`方法保存到数据库。 5. **查询和读取BLOB**:通过`Session`的`get()`或`...
例如,使用Java的JDBC API,可以创建PreparedStatement来执行INSERT语句,然后使用OutputStream将BASE64解码后的字节数组写入Blob对象。检索时,通过ResultSet获取Blob对象,再读取其InputStream,最终转换回图片。 ...
在本例中,我们使用 MEDIUMBLOB 字段来保存图片,因为 BLOB 字段的最大长度是 216-1 字节,大约 64K,而 MEDIUMBLOB 字段的最大长度是 224-1 字节,约 16M,足够用了。在保存图片时,我们使用了 saveImage() 方法,...
以下是一个Java程序的例子,展示了如何从MySQL数据库中获取BLOB数据并将其保存到本地文件系统,然后可能进一步上传到其他存储系统,如Hadoop HDFS或FTP服务器。 首先,我们需要导入必要的Java库,包括`java.sql`包...
2. Blob:最大存储65,535字节(约64KB),适用于中等大小的数据。 3. MediumBlob:最大存储16,777,215字节(约16MB),用于较大文件的存储。 4. LongBlob:最大存储4,294,967,295字节(约4GB),能够存储非常大的二...
当对TEXT和BLOB列进行排序时,MySQL只会对每个列的前`max_sort_length`字节进行排序,默认值为1024字节。这意味着如果排序依据的数据超出这个范围,排序结果可能不准确。可以通过修改配置文件来调整`max_sort_...
在MySQL中,TEXT和BLOB列在存储和检索时都不会进行大小写转换,这意味大小写敏感的比较和排序将基于实际输入的字节。 5. **严格模式** 在非严格模式下,如果尝试向BLOB或TEXT列插入超过列定义长度的数据,MySQL会...