【问题标题】:PreparedStatement with hextoraw in hsqldb throws java.sql.SQLDataException: data exception: string data, right truncation使用 hsqldb 中的 hextoraw 的 PreparedStatement 抛出 java.sql.SQLDataException: 数据异常:字符串数据,右截断
【发布时间】:2018-01-12 01:17:30
【问题描述】:

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

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

代码看起来像这样:

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 工具手动执行相同的操作,它就可以工作。

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

【问题讨论】:

  • 请添加竞争 stacttrace
  • 看起来hextoraw 的输出比列大小长
  • @jens 不,不是这样。我尝试使用 hsqldb 提供的工具手动执行完全相同的语句,它可以工作

标签: java jdbc prepared-statement hsqldb


【解决方案1】:

您可以尝试使用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();

【讨论】:

    【解决方案2】:

    不必使用 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 数据库。在上面添加一些大小检查代码将显示是否发生这种情况,并允许您更改两个数据库中的列大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2012-10-04
      • 2020-07-26
      • 2017-09-10
      • 1970-01-01
      • 2019-02-13
      • 2023-04-01
      • 2016-05-28
      相关资源
      最近更新 更多