Caused by: java.sql.SQLException: 数据大小超出此类型的最大值的问题?

relay_001 2008-09-24 11:31:06
在oracle9i数据库中,使用一个varchar类型的字段存储汉字,第一次保存的时候可以,但是在修改后再次保存的时候,报错,错误如下:
Caused by: org.hibernate.exception.GenericJDBCException: could not update: [com.Chineseridge.hgyc.share.hibernate.Newsinf#402881211279f3a601127a0d2b920027]
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:80)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2000)
at org.hibernate.persister.entity.BasicEntityPersister.updateOrInsert(BasicEntityPersister.java:1909)
at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2149)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:75)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at com.Chineseridge.hgyc.share.DAO.NewsinfDAO.update(NewsinfDAO.java:83)
... 29 more
Caused by: java.sql.SQLException: 数据大小超出此类型的最大值: 2050
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:147)
at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2460)
at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1190)
at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:1610)
at org.hibernate.type.StringType.set(StringType.java:24)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:62)
at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:39)
at org.hibernate.persister.entity.BasicEntityPersister.dehydrate(BasicEntityPersister.java:1617)
at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:1963)
... 41 more


我也在网上查找了一下相关的问题,有人说是oralce9的jdbc驱动的问题,说更新10g的驱动就可以了,可是更新后还是没有解决,问题依然存在,请高手不吝赐教......
...全文
2701 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuai1234 2010-05-13
  • 打赏
  • 举报
回复
数据库:Oracle 9i
数据库字段类型:varchar2(4000)
输入汉字:大于600字(左右)

问题1:当遇到“java.sql.SQLException:数据大小超出此类型的最大值”时...
解决办法:这是jdbc驱动的问题,更新一下Oracle的class12.jar驱动就可以解决(可以用oracle10j)。

问题2:当遇到“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”时...
原因:
我的数据库字符集应该是UTF-8的,对于UTF-8或欧洲的某些字符集,oracle在存储时,对于一个字符需要2个或3个字节的存储空间,虽然表定义中为varchar2(4000),但是其实该字段的data_length为其2倍或3倍长。这种情况下oracle会把data_length长度超过4000的当做LONG型处理,你的表中有两个这样的字段,插入数据时相当于同时操作2个LONG字段,所以报错。

解决办法:建议减小字段长度或拆分。实在需要的,可以转而采用CLOB字段类型。
bobod2008 2008-09-25
  • 打赏
  • 举报
回复
将所输入的字符串Trim 下
relay_001 2008-09-24
  • 打赏
  • 举报
回复
我在里面顶多输入了500汉字,可我设置的是3000,相差太远了,所以大家帮着想一下有没有别的可能造成这种问题的
lip009 2008-09-24
  • 打赏
  • 举报
回复
错误信息已经明显的告诉你你输入的数据超出了你的字段长度

看看你的字段长度多少?再看你输入的数据是否超出?
relay_001 2008-09-24
  • 打赏
  • 举报
回复
我用的就是varchar2类型的
yami251139 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fosjos 的回复:]
改用nvarchar试试
[/Quote]或者varchar2什么的
fosjos 2008-09-24
  • 打赏
  • 举报
回复
改用nvarchar试试

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧