`
Dead_knight
  • 浏览: 1200956 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240190
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48914
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236876
社区版块
存档分类
最新评论

PreparedStatem: 数据大小超出此类型的最大值

阅读更多
一、异常情况:
   有了一定Java编程经验之后,一般都使用PreparedStatement代替Statement。
   但实际开发中对数据库进行操作时,字段遇到大数据并且该字段为非BLOB,CLOB的类型时,若采用PreparedStatement方法setString方法时会如下异常: java.sql.SQLException: 数据大小超出此类型的最大值
   实际数据库定义字段长度为:4000,而包装的数据内容长度只有1000左右

二、分析原因:
1、驱动程序在把SQL语句发给数据库前,PreparedStatement对字符串进行预处理并进行了转义替换;
2、字符集原因。

三、解决办法:
   通过阅读PreparedStatement文档,setCharacterStream方法可以解决这个问题:
    stmt.setCharacterStream(1,
         new InputStreamReader(String内容, String内容.length());
四、案例总结:
   JDBC在转换过程中对字符串的长度做了限制。这个限制和数据库中字段的实际长度没有关系。而setCharacterStream()方法可以逃过字符转换限制,也就成为了解决此问题的方案之一。JDBC对转换字符长度的限制是为了转换过程中的数据扩展。根据实际测试结果,在ZHS16GBK字符集和thin驱动下,2000-4000长度的varchar字段都只能插入1333个字节(约666个汉字)。
   故解决PreparedStatement的setString中字符串长度问题可以有两种办法:
   1、使用setCharacterStream()方法;
   2、使用OCI驱动连接Oracle数据库。


分享到:
评论
4 楼 chenhua_1984 2012-05-09  
使用流的方式,JDBC batch会有限制,不支持的
3 楼 Dead_knight 2012-03-08  
arcpad 写道
你试验了吗?胡说八道

setCharacterStream这种方式试过的,2000个汉字可直接存放到varchar2(4000)定义的字段中。如果直接setString,是保存不了2000个汉字的。
oci驱动方式,还没试过,这种方式是HW提供的
2 楼 arcpad 2012-01-13  
你试验了吗?胡说八道
1 楼 xuyao 2008-12-09  
原来碰到过类似问题,呵呵

相关推荐

Global site tag (gtag.js) - Google Analytics