アプリケーションでhsqldbバージョン2.2.5を使用している場合があります
org.hsqldb.HsqlException:データ例外:文字列データ、正しい切り捨て。
だから私はそのために考えられる理由は何かを知りたいです。 varchar列にlongvarcharなどのデータを挿入していません。
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)
VARCHAR列の最大サイズはユーザー定義です。挿入されたデータがこれよりも大きい場合、例外がスローされます。以下の例では、サイズを100文字に制限するVARCHAR(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
を使用して、既存の列のサイズを増やすことができます。
Hibernate/HSQLDBが@Column
注釈を介して自動的に生成されたスキーマの場合、String型の@Entity
フィールドでlength
属性を指定する必要がある場合があります。そうでない場合、長さはデフォルトで255になり、長い入力は収まりません。
@Lob
@Column(name="column_name", length = 1000)
private String description;
フィールドの長さが十分ではありません。 [〜#〜] longvarchar [〜#〜] データ型を使用してこのエラーを修正しました。
CREATE TABLE "DEMO_TABLE"( "ID" NUMBER(19,0)、 "MESSAGE" LONGVARCHAR);
[〜#〜] warning [〜#〜]:Rant follow ...
はい、エラーメッセージJava.sql.SQLException: data exception: string data, right truncation...
は、何が間違っているかを知って初めて意味をなします。ときどき、ユーザーに知らせるための明確でわかりやすいエラーメッセージが表示されることがあります。 1つを書き込むのにかかる時間は100倍(または使用状況に応じてそれ以上)返されますが、通常は他のユーザーに返されます。したがって、ほとんどの人が時間を費やすにはあまりにも少ないインセンティブがあります。ただし、一般的に優れたエラーメッセージを持つSpring Frameworkのように、製品に利益をもたらすことができます。
Stackoverflow.comが気にしないと確信しています。エラーメッセージの質が低いと、毎日1分ごとに人々がここにいることになります。
HSQLDBでHibernateを使用しているときにこのエラーが発生しました。通常の文字列フィールドの代わりに、攻撃者はシリアル化可能なフィールドでした。
Hibernateマッピングファイルは
<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 [〜#〜]タイプの列をHSQLDBに最大長255で作成します。シリアル化されたオブジェクトのサイズはこのサイズを超えていたため、HSQLDBによってデータ例外:文字列データ、右切り捨てがスローされました。
sql-type属性を使用してファクト列をBlobに変更すると、問題が解決します。
<property name="facts" type="serializable">
<column name="facts" sql-type="blob" />
</property>
HSQLDBでテストしているときに説明したのと同じ問題がありました。
JPA実装としてhibernateを使用していますが、これは私のマッピングクラスです。
@Column (name = "file")
private byte[] file;
実稼働環境ではPostgreSQLを使用していますが、問題は表示されませんが、HSQLでは、そのエラーを解決するためにマッピングに@Type
注釈を追加する必要がありました。
@Column (name = "file")
@Type(type = "org.hibernate.type.MaterializedBlobType")
private byte[] file;
型には多くの実装があります。パッケージorg.hibernate.type
内のhibernate-core jarを見て、マッピングに一致するものを選択できます。
私は実際に同じ問題に直面し、比較的迅速に修正されました。私の場合、次のようにDBテーブル列カラムを宣言しました:description VARCHAR(50)、しかしより長い文字列/テキストをそこに挿入しようとして、それが例外を引き起こしました。
これがあなたを助けることを願っています:)