hsqldb中带有hextoraw的PreparedStatement抛出java.sql.SQLDataException:数据异常:字符串数据,右截断

时间:2017-08-04 07:49:18

标签: java jdbc prepared-statement hsqldb

我将数据从一个hsqldb传输到另一个hsqldb。两者都有相同的表等。模式完全相同。

我有一些大量的二进制列(不是我的设计决定,但我必须使用它)。那些我用数据库rawtohex中的A函数读取的字符串,并使用B函数写入数据库hextoraw

代码看起来像这样:

String query = "SELECT rawtohex(PAYLOAD) FROM TABLE_X;"
Statement selectPst = connA.createStatement();
ResultSet data = selectPst.executeQuery(query);

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (hextoraw(?))";
PreparedStatement insStmt = connB.prepareStatement(insert);

data.next();
insStmt.setString(1, data.getString(1));

insStmt.executeUpdate(); // <- java.sql.SQLDataException: data exception: string data, right truncation

通常,如果列对于数据来说太小,则抛出此异常。但是数据存在于具有相同表和列的数据库中,如果我使用hsqldb工具手动执行相同操作,则可以正常工作。

我很感激任何可能导致这种情况的想法!

2 个答案:

答案 0 :(得分:0)

您可以尝试使用readBinaryStreamwriteBinaryStream方法,而不是使用rawtohex,例如:

String query = "SELECT PAYLOAD FROM TABLE_X;"
Statement selectPst = connA.createStatement();
ResultSet data = selectPst.executeQuery(query);

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (?)";
PreparedStatement insStmt = connB.prepareStatement(insert);

data.next();
insStmt.setBinaryStream(1, data.getBinaryStream(1));

insStmt.executeUpdate();

答案 1 :(得分:0)

没有必要使用RAWTOHEX和HEXTORAW。

String query = "SELECT PAYLOAD FROM TABLE_X;"
Statement selectPst = connA.createStatement();
ResultSet data = selectPst.executeQuery(query);

String insert = "INSERT INTO TABLE_X (PAYLOAD) VALUES (?)";
PreparedStatement insStmt = connB.prepareStatement(insert);

data.next();
byte[] databytes = data.getBytes(1);

// add code here to check if (databytes.length > columnSize)
insStmt.setBytes(1, databytes);

insStmt.executeUpdate(); //

在某些情况下,可能会在未应用大小检查的情况下将数据插入connA数据库。添加上面的一些大小检查代码将显示是否发生这种情况,并允许您更改两个数据库中的列大小。