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)
Ответы
Ответ 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 ")"! Эта ошибка возникла бы, что на самом деле не указывает на реальную проблему.