Подтвердить что ты не робот

HsqlException: исключение данных

Я использую hsqldb версии 2.2.5 в своем приложении, иногда я получаю

org.hsqldb.HsqlException: исключение данных: строковые данные, усечение справа.

Поэтому я хочу знать, каковы возможные причины этого. Я не вставляю данные типа longvarchar в столбец varchar.

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)
4b9b3361

Ответ 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

Длина вашего поля недостаточно велика. Я использовал тип данных LONGVARCHAR, чтобы исправить эту ошибку.

CREATE TABLE "DEMO_TABLE" ("ID" НОМЕР (19,0), "MESSAGE" LONGVARCHAR);

ВНИМАНИЕ: Rant следует...

Да, сообщение об ошибке java.sql.SQLException: data exception: string data, right truncation... имеет смысл только после того, как вы поймете, что неправильно. Иногда я нахожу четкое, хорошо написанное сообщение об ошибке, предназначенное для информирования пользователей. Время, необходимое для написания одного, будет возвращено в 100 раз (или больше в зависимости от использования), но обычно другим. Следовательно, у большинства слишком мало стимулов тратить время. Однако он может принести пользу продукту, как и в случае Spring Framework, в котором обычно появляются сообщения об ошибках.

Я уверен, что stackoverflow.com не против. Плохие сообщения об ошибках, вероятно, приводят людей сюда каждую минуту каждого дня!

Ответ 3

Для автоматической сгенерированной схемы Hibernate/HSQLDB с помощью аннотации @Column в поле @Entity типа String вам может потребоваться указать length атрибут. В противном случае длина будет по умолчанию равной 255, а длинный ввод не подходит:

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

Ответ 4

Я столкнулся с этой ошибкой при использовании Hibernate с HSQLDB. Вместо обычного поля String злоумышленник был сериализуемым полем.

Файл сопоставления спящего режима был

<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 создает столбец типа VARBINARY с максимальной длиной 255 в HSQLDB. Поскольку размер сериализованного объекта был больше, чем этот размер исключение данных: строковые данные, правильное усечение было выбрано HSQLDB.

Изменение столбца фактов в Blob с атрибутом sql-type устраняет проблему.

   <property name="facts" type="serializable">
          <column name="facts" sql-type="blob" />
   </property>

Ответ 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;

Существует множество реализаций типов. Вы можете посмотреть на hibernate-core jar внутри пакета org.hibernate.type и выбрать некоторые из них, соответствующие вашим сопоставлениям.

Ответ 7

Эта ошибка возникает в некоторых сценариях, но в следующем сценарии это сложно для получения причины, предположим следующий сценарий: Предположим, что следующая сущность

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

Когда аннотация "@ManyToOne" будет забыта, но будет добавлена ​​аннотация "@JoinColumn (name =" ownerId ")"! Эта ошибка возникла бы, что на самом деле не указывает на реальную проблему.