【问题标题】:HsqlException: data exceptionHsqlException:数据异常
【发布时间】:2011-11-25 18:55:36
【问题描述】:

我有时会在我的应用程序中使用 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)

【问题讨论】:

  • 我通过将 varchar() 更改为 CHAR VARYING 来解决,这是默认的 varchar(32768) ,它会动态更新。

标签: hsqldb


【解决方案1】:

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 来增加现有列的大小。

【讨论】:

    【解决方案2】:

    对于 Hibernate/HSQLDB 通过 @Column 注释在 String 类型的 @Entity 字段上自动生成的模式,您可能需要提供 length 属性。否则长度将默认为 255 并且长输入将不适合:

    @Lob
    @Column(name="column_name", length = 1000)
    private String description;
    

    【讨论】:

      【解决方案3】:

      您的字段长度不够大。我使用了LONGVARCHAR 数据类型来修复这个错误。

      CREATE TABLE "DEMO_TABLE" ("ID" NUMBER(19,0), "MESSAGE" LONGVARCHAR);

      警告:接下来是咆哮……

      是的,错误消息java.sql.SQLException: data exception: string data, right truncation... 只有在您知道出了什么问题后才完全有意义。有时我会发现一条清晰、编写良好的错误消息,旨在通知用户。写一个所花费的时间将返回 100 倍(或更多取决于使用情况),但通常会返回给其他人。因此,对于大多数人来说,花时间的动力太少了。然而,它可以让产品受益,就像 Spring 框架一样,它通常具有更好的错误消息。

      我确定 stackoverflow.com 不介意。糟糕的错误消息可能会每天每时每刻都在驱使人们来到这里!

      【讨论】:

        【解决方案4】:

        我在使用 Hibernate 和 HSQLDB 时遇到了这个错误。冒犯者不是通常的 String 字段,而是一个可序列化的字段。

        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>
        

        【讨论】:

        • 这里有同样的问题。如果有人好奇,等效的注释将是 @Column(columnDefinition = "blob")
        【解决方案5】:

        我实际上遇到了同样的问题,并且相对较快地得到了解决。 在我的例子中,我声明了一个 DB 表列,如下所示:description VARCHAR(50),但我试图在其中插入更长的字符串/文本,这导致了异常。

        希望对你有帮助:)

        【讨论】:

          【解决方案6】:

          在使用 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,然后选择一些与您的映射匹配的。

          【讨论】:

            【解决方案7】:

            此错误发生在某些场景中,但在以下场景中很难 要检索原因,假设以下情况: 假设以下实体

            @Entity
            public class Car {
               private String name;
               @ManyToOne
               @JoinColumn(name = "ownerId")
               private Owner owner;
                    ...
            

            当注释 '@ManyToOne' 会被遗忘,但注释 '@JoinColumn(name = "ownerId")' 会出现时!会发生此错误,这并不代表真正的问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-10
              • 1970-01-01
              • 2015-06-24
              • 1970-01-01
              • 2017-01-07
              • 2011-11-07
              • 2016-02-02
              • 2020-02-14
              相关资源
              最近更新 更多