使用Mysql的Blob要注意Blob最大限制到65K字节

     今天在使用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)