我在我的应用程序中使用hsqldb 2.2.5版,有时候我正在
org.hsqldb.HsqlException:数据异常:字符串数据,右截断。
所以我想知道可能的原因是什么。我没有在varchar列中插入任何像longvarchar这样的数据。
http://sourceforge.net/tracker/index.php?func=detail&aid=2993445&group_id=23316&atid=378131
我搜索了以上链接,但无法得到适当的反馈。
在下面的异常堆栈中给出 这种例外不会经常发生。
那么可能是什么原因以及如何在脚本文件中设置数据类型长度以在运行时增加?
java.sql.SQLException: data exception: string data, right truncation
at org.hsqldb.jdbc.Util.sqlException(Util.java:255)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(JDBCPreparedStatement.java:4659)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(JDBCPreparedStatement.java:311)
at com.dikshatech.agent.db.NodesRuntimeTable.persistData(NodesRuntimeTable.java:151)
at com.dikshatech.agent.jobs.WorkFlowJob.execute(WorkFlowJob.java:108)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: org.hsqldb.HsqlException: data exception: string data, right truncation
at org.hsqldb.error.Error.error(Error.java:134)
at org.hsqldb.error.Error.error(Error.java:104)
at org.hsqldb.types.CharacterType.castOrConvertToType(CharacterType.java:523)
at org.hsqldb.types.CharacterType.convertToType(CharacterType.java:638)
at org.hsqldb.StatementDML.getInsertData(StatementDML.java:921)
at org.hsqldb.StatementInsert.getResult(StatementInsert.java:124)
at org.hsqldb.StatementDMQL.execute(StatementDMQL.java:190)
at org.hsqldb.Session.executeCompiledStatement(Session.java:1344)
at org.hsqldb.Session.execute(Session.java:997)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(JDBCPreparedStatement.java:4651)
答案 0 :(得分:16)
VARCHAR列的最大大小是用户定义的。如果插入的数据大于此值,则抛出异常。下面的示例定义了一个带有VARCHAR(100)列的表,该列将大小限制为100个字符。
CREATE TABLE T (ID INT, DATA VARCHAR(100))
您可以使用数据库管理器并执行SCRIPT命令来查看所有表定义及其列大小。或者,SELECT * FROM INFORMATION_SCHEMA.COLUMNS
显示每列的特征。
您可以使用ALTER TABLE table_name ALTER COLUMN col_name SET DATA TYPE
来增加现有列的大小。
答案 1 :(得分:6)
你的场长不够大。我使用LONGVARCHAR数据类型来修复此错误。
CREATE TABLE" DEMO_TABLE" (" ID" NUMBER(19,0)," MESSAGE" LONGVARCHAR);
警告:Rant跟随......
是的,只有在你知道错误之后,错误信息java.sql.SQLException: data exception: string data, right truncation...
才有意义。偶尔我会找到一个清晰,写得很好的错误消息,旨在通知用户。写一个的时间将返回100倍(或更多取决于使用情况),但通常是其他人。因此,大多数人花费时间的动机太少了。然而,它可以回来使产品受益,就像Spring框架一样,它通常具有优异的错误信息。
我确定stackoverflow.com不介意。糟糕的错误消息可能会让每天每分钟都有人在这里!
答案 2 :(得分:5)
对于Hibernate / HSQLDB通过@Column
类型字符串的@Entity
字段上的length
注释自动生成的架构,您可能需要提供@Lob
@Column(name="column_name", length = 1000)
private String description;
atrribute。否则,长度将默认为255,长输入将不适合:
List<Time> list = swap(t1,t2);
t1 = list.get(0); t2 = list.get(1);
答案 3 :(得分:4)
我在使用HQLnate和HSQLDB时遇到此错误。罪犯是一个可序列化的字段,而不是通常的字符串字段。
Hibernate映射文件是
<hibernate-mapping package="in.fins.shared">
<class name="Data">
<id name="id" column="id">
<generator class="uuid" />
</id>
<property name="date" column="Date" />
<property name="facts" column = "facts" type="serializable" />
</class>
</hibernate-mapping>
对于设置为可序列化的事实字段,Hibernate在HSQLDB中创建一个类型为 VARBINARY 的列,最大长度为255。由于序列化对象大小超过此大小数据异常:字符串数据,HSQLDB抛出了右截断。
使用 sql-type 属性将事实列更改为Blob可解决此问题。
<property name="facts" type="serializable">
<column name="facts" sql-type="blob" />
</property>
答案 4 :(得分:1)
我实际上遇到了同样的问题,并且相对较快地得到了修复。 在我的情况下,我已经声明了一个DB表列列,如下所示:description VARCHAR(50),但我试图在那里插入一个更长的字符串/文本,这导致了异常。
希望这会对你有所帮助:)。
答案 5 :(得分:1)
我遇到了与使用HSQLDB进行测试时描述的问题相同的问题。
我使用hibernate作为JPA实现,这是我的映射类:
@Column (name = "file")
private byte[] file;
在制作中我使用PostgreSQL并且问题没有显示出来,但是使用HSQL我必须在我的映射中添加@Type
注释来解决该错误:
@Column (name = "file")
@Type(type = "org.hibernate.type.MaterializedBlobType")
private byte[] file;
有许多类型的实现。您可以在包org.hibernate.type
中查看hibernate-core jar,并选择一些与您的映射匹配的内容。
答案 6 :(得分:-1)
在某些情况下会发生此错误,但在以下情况下很难 要检索原因,请假设以下情况: 假设以下实体
@Entity
public class Car {
private String name;
@ManyToOne
@JoinColumn(name = "ownerId")
private Owner owner;
...
当忘记注释'@ManyToOne'时,注释'@JoinColumn(name =“ownerId”)'将出现!会发生此错误,这并不能真正指出真正的问题。