web-dev-qa-db-fra.com

HsqlException: exception de données

J'utilise la version 2.2.5 de hsqldb dans mon application, parfois je reçois

org.hsqldb.HsqlException: exception de données: données de chaîne, troncature à droite.

Je veux donc savoir quelles sont les raisons possibles de cela. Je n'insère aucune donnée comme longvarchar dans une colonne varchar.

http://sourceforge.net/tracker/index.php?func=detail&aid=2993445&group_id=23316&atid=378131

J'ai recherché le lien ci-dessus mais je n'ai pas pu obtenir de commentaires appropriés.


Étant donné sous la pile d'exceptions Cette exception ne se produit pas fréquemment.

Alors, quelle pourrait être la raison de cela et comment définir la longueur du type de données dans le fichier de script pour augmenter au moment de l'exécution?

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)
25
Anil

La taille maximale d'une colonne VARCHAR est définie par l'utilisateur. Si les données insérées sont plus grandes que cela, une exception est levée. L'exemple ci-dessous définit un tableau avec une colonne VARCHAR (100), ce qui limite la taille à 100 caractères.

CREATE TABLE T (ID INT, DATA VARCHAR(100))

Vous pouvez utiliser un gestionnaire de base de données et exécuter la commande SCRIPT pour voir toutes vos définitions de table et leur taille de colonne. Alternativement, SELECT * FROM INFORMATION_SCHEMA.COLUMNS montre les caractéristiques de chaque colonne.

Vous pouvez utiliser le ALTER TABLE table_name ALTER COLUMN col_name SET DATA TYPE pour augmenter la taille d'une colonne existante.

19
fredt

Pour Hibernate/HSQLDB, le schéma généré automatiquement via @Column annotation sur @Entity champ de type String que vous devrez peut-être fournir length atrribute. Sinon, la longueur sera par défaut de 255 et l'entrée longue ne conviendra pas:

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

La longueur de votre champ n'est pas assez grande. J'ai utilisé le type de données LONGVARCHAR pour corriger cette erreur.

CRÉER LA TABLE "DEMO_TABLE" ("ID" NUMBER (19,0), "MESSAGE" LONGVARCHAR);

[~ # ~] avertissement [~ # ~] : Rant suit ...

Oui, le message d'erreur Java.sql.SQLException: data exception: string data, right truncation... n'a de sens que lorsque vous savez ce qui ne va pas. Parfois, je trouve un message d'erreur clair et bien écrit, destiné à informer les utilisateurs. Le temps nécessaire pour en écrire un sera retourné 100 fois (ou plus selon l'utilisation), mais généralement à d'autres. Par conséquent, il y a trop peu d'incitation pour la plupart à passer du temps. Il peut cependant revenir au profit du produit, comme avec le framework Spring qui a généralement des messages d'erreur supérieurs.

Je suis sûr que stackoverflow.com ne me dérange pas. De mauvais messages d'erreur poussent probablement les gens ici chaque minute de chaque jour!

6
KSev

J'ai rencontré cette erreur lors de l'utilisation d'Hibernate avec HSQLDB. Au lieu du champ String habituel, le délinquant était un champ sérialisable.

Le fichier de mise en veille prolongée était

<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>

Pour le champ de faits, qui est défini sur sérialisable, Hibernate crée une colonne de type VARBINARY avec une longueur maximale de 255 dans HSQLDB. Comme la taille de l'objet sérialisé était supérieure à cette taille exception de données: données de chaîne, troncature droite a été levé par HSQLDB.

Changer la colonne des faits en Blob avec l'attribut type sql-type résout le problème.

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

J'ai eu le même problème que vous décrivez lors des tests avec HSQLDB.

J'utilise hibernate comme implémentation JPA et voici ma classe de mappage:

@Column (name = "file")
private byte[] file;

En production, j'utilise PostgreSQL et le problème n'apparaît pas, mais avec HSQL j'ai dû ajouter le @Type annotation dans mon mappage pour résoudre cette erreur:

@Column (name = "file")
@Type(type = "org.hibernate.type.MaterializedBlobType")
private byte[] file;

Il existe de nombreuses implémentations de types. Vous pouvez jeter un œil au pot hibernate-core, à l'intérieur du paquet org.hibernate.type et choisissez ceux qui correspondent à vos mappages.

1
leocborges

En fait, j'ai été confronté au même problème et je me suis résolu assez rapidement. Dans mon cas, j'ai déclaré une colonne de colonne de table DB comme ceci: description VARCHAR (50), mais j'essayais d'y insérer une chaîne/du texte plus longue, et cela a provoqué l'exception.

J'espère que cela vous aidera :)

1
ppalancica