2011-09-27 13 views
20

sto usando hsqldb versione 2.2.5 nella mia applicazione a volte sto ricevendo org.hsqldb.HsqlException: data exception: string data, right truncation.so voglio sapere quali sono le possibili ragioni per questo. non sto inserendo alcun dato come longvarchar nella colonna varchar.HsqlException: data exception

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

ho cercato link qui sopra, ma non ha potuto ottenere un adeguato feedback.

Grazie in anticipo.


Dato che segue l'eccezione di stack Questa eccezione non sta accadendo di frequente.

Quindi quale potrebbe essere la ragione e come impostare la lunghezza del tipo di dati nel file di script per aumentare in fase di esecuzione?

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

Ho risolto cambiando varchar() in CHAR VARYING che è defult varchar (32768) chages dinamicamente. – Anil

risposta

16

La dimensione massima di una colonna VARCHAR è definita dall'utente. Se i dati inseriti sono più grandi di questo, viene generata un'eccezione. L'esempio seguente definisce una tabella con una colonna VARCHAR (100), che limita la dimensione a 100 caratteri.

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

È possibile utilizzare un gestore di database ed eseguire il comando SCRIPT per vedere tutte le definizioni di tabella e la loro dimensione della colonna. In alternativa, SELECT * FROM INFORMATION_SCHEMA.COLUMNS mostra le caratteristiche di ciascuna colonna.

È possibile utilizzare ALTER TABLE table_name ALTER COLUMN col_name SET DATA TYPE per aumentare le dimensioni di una colonna esistente.

0

Ho effettivamente affrontato lo stesso problema e mi sono risolto in tempi relativamente brevi. Nel mio caso ho dichiarato una colonna di colonne della tabella DB come questa: descrizione VARCHAR (50), ma stavo cercando di inserire una stringa/testo più lunga e ciò ha causato l'eccezione.

Spero che questo vi aiuterà a :)

-1

Questo errore si verifica in alcuni scenari di ma nel seguente scenario è difficile per recuperare la causa, assumere seguente scenario: assumere i seguenti entità

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

Quando l'annotazione '@ManyToOne' verrebbe dimenticata, ma l'annotazione '@JoinColumn (name = "ownerId")' sarebbe presente! Questo errore si verificherebbe, il che non indica realmente il vero problema.

3

Ho riscontrato questo errore durante l'utilizzo di Hibernate con HSQLDB. Invece del solito campo String, l'autore del reato era un campo serializzabile.

file di mapping Hibernate era

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

per i fatti di campo, che è impostato per serializzabile, Hibernate crea una colonna di tipo VARBINARY con lunghezza massima 255 in HSQLDB. Dato che la dimensione dell'oggetto serializzato era più di questa dimensione: eccezione dati: dati stringa, il troncamento destro veniva generato da HSQLDB.

La modifica della colonna di fatti su BLOB con l'attributo sql tipo risolve il problema.

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

Lo stesso problema qui. Se qualcuno è curioso, l'annotazione equivalente sarebbe '@Column (columnDefinition =" blob ")' –

4

La lunghezza del campo non è abbastanza grande. Ho usato il tipo di dati LONGVARCHAR per correggere questo errore.

CREATE TABLE "DEMO_TABLE" ("ID" NUMERO (19,0), "MESSAGGIO" LONGVARCHAR);

ATTENZIONE: Rant segue ...

Sì, il messaggio di errore java.sql.SQLException: data exception: string data, right truncation... senso totale solo dopo sai cosa c'è che non va. Occasionalmente trovo un messaggio di errore chiaro e ben scritto, pensato per informare gli utenti. Il tempo necessario per scriverne uno verrà restituito 100 volte (o più in base all'utilizzo), ma in genere agli altri. Quindi, c'è troppo poco incentivo per la maggior parte di trascorrere il tempo. Può tuttavia tornare a vantaggio del prodotto, come nel caso di Spring Framework che ha generalmente messaggi di errore di livello superiore.

Sono sicuro che stackoverflow.com non si preoccupa. Messaggi di errore scadenti probabilmente spingono le persone qui ogni minuto di ogni giorno!

1

Ho avuto lo stesso problema che descrivi durante il test con HSQLDB.

Sto usando Hibernate come implementazione JPA e questa è la mia classe di mappatura:

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

Nella produzione sto usando PostgreSQL e il problema non mostrata, ma con HSQL ho dovuto aggiungere il @Type annotazione nel mio mappatura per risolvere tale errore:

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

ci sono molte implementazioni di tipi. Puoi dare un'occhiata al vaso hibernate-core, all'interno del pacchetto org.hibernate.type e sceglierne alcuni corrispondenti ai tuoi mapping.

1

per Hibernate/HSQLDB generato automaticamente schema tramite @Column annotazione sulla @Entity campo di tipo stringa che si potrebbe essere necessario fornire length atrribute. In caso contrario, la lunghezza verrà impostata su 255 e l'input lungo non verrà adattato:

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