2011-09-27 34 views
20

Tôi đang sử dụng phiên bản hsqldb 2.2.5 trong ứng dụng của tôi đôi khi tôi nhận được org.hsqldb.HsqlException: dữ liệu ngoại lệ: dữ liệu chuỗi, phải cắt ngắn. Tôi muốn biết lý do có thể cho điều đó là gì. tôi không chèn bất kỳ dữ liệu nào như longvarchar trong cột varchar.HsqlException: ngoại lệ dữ liệu

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

tôi đã tìm kiếm ở trên liên kết nhưng không thể nhận được phản hồi phù hợp.

Xin cảm ơn trước.


Được đặt bên dưới ngăn ngoại lệ Ngoại lệ này không xảy ra thường xuyên.

Vậy điều gì có thể là lý do cho việc đó và cách đặt độ dài loại dữ liệu trong tệp tập lệnh để tăng thời gian chạy?

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

Tôi đã giải quyết bằng cách thay đổi varchar() thành CHAR VARYING, đó là defult varchar (32768) nó chages động. – Anil

Trả lời

16

Kích thước tối đa của cột VARCHAR do người dùng xác định. Nếu dữ liệu được chèn lớn hơn, thì một ngoại lệ sẽ được ném. Ví dụ dưới đây định nghĩa một bảng có cột VARCHAR (100), giới hạn kích thước là 100 ký tự.

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

Bạn có thể sử dụng trình quản lý cơ sở dữ liệu và thực thi lệnh SCRIPT để xem tất cả các định nghĩa bảng và kích thước cột của bảng. Cách khác, SELECT * FROM INFORMATION_SCHEMA.COLUMNS hiển thị các đặc điểm của mỗi cột.

Bạn có thể sử dụng ALTER TABLE table_name ALTER COLUMN col_name SET DATA TYPE để tăng kích thước của cột hiện tại.

0

Tôi thực sự phải đối mặt với cùng một vấn đề và đã được khắc phục tương đối nhanh chóng. Trong trường hợp của tôi, tôi đã khai báo cột cột bảng DB như sau: description VARCHAR (50), nhưng tôi đã cố gắng chèn một chuỗi dài hơn/văn bản trong đó, và điều đó gây ra ngoại lệ.

Hy vọng điều này sẽ giúp bạn :)

-1

Lỗi này xảy ra trong một số kịch bản, nhưng trong các tình huống sau rất khó để lấy nguyên nhân, giả sử sau kịch bản: Giả sử các thực thể sau

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

Khi chú thích '@ManyToOne' bị lãng quên, nhưng chú thích '@JoinColumn (name = "ownerId")' sẽ xuất hiện! Lỗi này sẽ xảy ra, điều này thực sự không chỉ ra vấn đề thực sự.

3

Tôi gặp phải lỗi này trong khi sử dụng Hibernate với HSQLDB. Thay vì trường String thông thường, người phạm tội là một trường có thể tuần tự hóa.

Hibernate tập tin bản đồ là

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

Đối với lĩnh vực sự kiện, được thiết lập để serializable, Hibernate tạo ra một cột kiểu VARBINARY với chiều dài tối đa 255 trong HSQLDB. Khi kích thước đối tượng được tuần tự hóa lớn hơn kích thước này ngoại lệ dữ liệu: dữ liệu chuỗi, cắt xén phải được HSQLDB đưa ra.

Thay đổi cột sự kiện thành Blob với thuộc tính sql-type giải quyết vấn đề.

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

Cùng một vấn đề ở đây. Nếu có ai tò mò thì chú giải tương đương sẽ là '@Column (columnDefinition =" blob ")' –

4

Độ dài trường của bạn không đủ lớn. Tôi đã sử dụng loại dữ liệu LONGVARCHAR để khắc phục lỗi này.

TẠO BẢNG "DEMO_TABLE" ("ID" NUMBER (19,0), "THÔNG ĐIỆP" LONGVARCHAR);

CẢNH BÁO: Rant sau ...

Yep, thông báo lỗi java.sql.SQLException: data exception: string data, right truncation... làm tổng cảm giác chỉ sau khi bạn biết những gì là sai. Thỉnh thoảng tôi tìm thấy một thông báo lỗi rõ ràng, được viết tốt, có nghĩa là để thông báo cho người dùng. Thời gian để viết một cái sẽ được trả lại 100 lần (hoặc nhiều hơn tùy thuộc vào cách sử dụng), nhưng thường là cho người khác. Do đó, có quá ít động cơ để dành phần lớn thời gian. Tuy nhiên, nó có thể quay trở lại để có lợi cho sản phẩm, như với khung công tác Spring có thông báo lỗi thông thường.

Tôi chắc chắn stackoverflow.com không quan tâm. Thông báo lỗi kém có khả năng hướng mọi người đến đây mỗi phút mỗi ngày!

1

Tôi gặp vấn đề tương tự như bạn mô tả trong khi thử nghiệm với HSQLDB.

Tôi đang sử dụng chế độ ngủ đông như thực hiện JPA và đây là lớp bản đồ của tôi:

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

Trong sản xuất Tôi đang sử dụng PostgreSQL và vấn đề không thể hiện lên, nhưng với HSQL tôi phải thêm @Type chú thích trong ánh xạ của tôi để giải quyết lỗi đó:

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

Có nhiều loại triển khai. Bạn có thể nhìn vào hibernate-core jar, bên trong gói org.hibernate.type và chọn một số khớp với ánh xạ của bạn.

1

Đối với Hibernate/HSQLDB lược đồ được tạo tự động qua @Column chú thích trên @Entity trường loại Chuỗi, bạn có thể cần cung cấp length atrribute. Nếu không, độ dài sẽ mặc định là 255 và đầu vào dài sẽ không phù hợp:

@Lob 
@Column(name="column_name", length = 1000) 
private String description; 
Các vấn đề liên quan