我将数据从一个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工具手动执行相同操作,则可以正常工作。
我很感激任何可能导致这种情况的想法!
答案 0 :(得分:0)
您可以尝试使用readBinaryStream
和writeBinaryStream
方法,而不是使用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
数据库。添加上面的一些大小检查代码将显示是否发生这种情况,并允许您更改两个数据库中的列大小。