2011-09-27 11 views
20

benim uygulamada bazen hsqldb sürüm 2.2.5 kullanıyorum org.hsqldb.HsqlException alıyorum: veri istisnası: dize veri, doğru truncation.so bunun için olası nedenleri olduğunu bilmek istiyorum. Varchar sütununda longvarchar gibi herhangi bir veri eklemiyorum. HsqlException: veri istisnası

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

i yukarıdaki bağlantıya arandı ancak uygun geribildirim alamadım.

Şimdiden teşekkürler.


Bu istisna sık olmuyor istisna yığını altına alındığında.

Peki, bunun nedeni ne olabilir ve komut dosyası dosyasında veri tipi uzunluğunu çalışma zamanında artırmak için nasıl ayarlanır?

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

ben defult varchar (32768) dinamik chages olan karakteri farklı için varchar() değiştirerek çözdü. – Anil

cevap

16

VARCHAR sütununun maksimum boyutu kullanıcı tanımlıdır. Eklenen veriler bundan daha büyükse, bir istisna atılır. Aşağıdaki örnek, boyutu 100 karakterle sınırlayan VARCHAR (100) sütunlu bir tabloyu tanımlar.

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

Bir veritabanı yöneticisi kullanımı ve tüm tablo tanımlarını ve bunların sütun boyutunu görmek için SCRIPT komutunu çalıştırabilirsiniz. Alternatif olarak, SELECT * FROM INFORMATION_SCHEMA.COLUMNS, her sütunun özelliklerini gösterir.

Varolan bir sütunun boyutunu artırmak için ALTER TABLE table_name ALTER COLUMN col_name SET DATA TYPE kullanabilirsiniz.

0

Aslında aynı problemle karşılaştım ve nispeten hızlı bir şekilde düzelttim. Benim durumumda bir DB tablo sütunu sütununu şöyle beyan ettim: description VARCHAR (50), ama orada daha uzun bir dize/metin eklemeye çalışıyordum ve bu durum istisnaya neden oldu.

Umut bu size yardımcı olacaktır :)

-1

Bu hata bazı senaryo en oluşur ancak aşağıdaki senaryoda o nedenini almak farz senaryo aşağıdaki zordur: Aşağıdaki işletmeye bırakmıştır

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

'@ManyToOne' ifadesi unutulacak, ancak '@JoinColumn (name = "ownerId")' ifadesi mevcut olacaktır! Bu hatayı gerçekten gerçek meseleyi göstermeyen ortaya çıkacaktır.

3

Bu hatayı, HSQLDB ile Hibernate kullanırken karşılaştım. Her zamanki String alanı yerine, suçlu seri hale getirilebilir bir alandır.

hazırda eşleme dosyası seri olarak ayarlanır gerçekler alan için

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

, hazırda HSQLDB maksimum uzunluğu 255 ile tip VARBINARY bir sütun oluşturur oldu. Serileştirilmiş nesne boyutu bu boyuttan daha büyük olduğu için veri istisnası: dize verileri, doğru kesim HSQLDB tarafından atılmıştır.

sql-type özniteliğiyle Blob için gerçekler sütununun değiştirilmesi, sorunu giderir.

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

Aynı sorun burada. Birisi merak ediyorsa, eşdeğer bir açıklama “@ Column (columnDefinition =" blob ") olacaktır. –

4

Tarla uzunluğunuz yeterince büyük değil. Bu hatayı düzeltmek için LONGVARCHAR veri türünü kullandım.

TABLO "DEMO_TABLE" ("Kimlik" NUMARASI (19,0), "MESAJ" LONGVARCHAR);

UYARI: Rant izler ...

Evet, hata mesajı java.sql.SQLException: data exception: string data, right truncation... sorunun nerede olduğunu biliyoruz sonra toplam mantıklı. Bazen, kullanıcıları bilgilendirmek için açık, iyi yazılmış bir hata mesajı buluyorum. Yazmak için gereken süre 100 kat (veya kullanıma bağlı olarak daha fazla), ancak genellikle başkalarına iade edilir. Bu nedenle, çoğu zaman harcamak için çok az teşvik var. Ancak, genel olarak üstün hata mesajlarına sahip olan Spring Framework'de olduğu gibi, ürüne fayda sağlamak için geri gelebilir.

Eminim stackoverflow.com'un aldırış etmiyordur. Kötü hata mesajları, insanları her gün her dakika buraya sürükleyebilir!

1

HSQLDB ile test ederken anlattığınız gibi aynı sorunu yaşadım.

Ben JPA uygulaması hazırda kullanıyorum ve bu benim haritalama sınıftır: PostgreSQL ve sorunu kullanıyorum üretiminde

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

çoktan yok

ama HSQL ile ben eklemek zorunda

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

türlerinin pek çok yolu vardır: benim eşlemenizde @Type açıklama bu hatayı çözmek için. org.hibernate.type numaralı paketin içindeki hazırda kavanoza bir göz atabilir ve eşleştirmelerinizle eşleşenleri seçebilirsiniz. Hazırda/HSQLDB için

1

otomatik length atrribute vermeniz gerekebilir türü String @Entity sahada @Column açıklama yoluyla şema oluşturulur. Aksi halde uzunluk 255 varsayılan olarak ve uzun giriş sığmaz:

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