【问题标题】:Debugging a MysqlDataTruncation exception调试 MysqlDataTruncation 异常
【发布时间】:2012-12-31 02:10:24
【问题描述】:

我正在使用以下例程将信息存储在数据库中:

try{
connection = cpds.getConnection();
pstmt = connection.prepareStatement("select setSomeData(?,?)");
//set data to the statement
res = pstmt.executeQuery();
//process data retrieved
} catch (SQLException ex) {
        System.out.println("SQLException: " + ex);
        ex.printStackTrace();
        return null;
    } finally {
        try {
            pstmt.close();
            connection.close();
        } catch (SQLException ex) {
    }
}

但有时我会遇到此异常:

SQLException:com.mysql.jdbc.MysqlDataTruncation:数据截断:BIGINT UNSIGNED 值超出“(tstmp@5 - lastEvent@11)”的范围
com.mysql.jdbc.MysqlDataTruncation:数据截断:BIGINT UNSIGNED 值超出 '(tstmp@5 - lastEvent@11)'的范围
在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
在 com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2066)
在 com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1922)
在 com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3414)
在 com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:481)
在 com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3120)
在 com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2288)
在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2709)
在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2134)
在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2300)
在 com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:116)

是否可以了解有关异常的更多信息,例如受影响的列以及我尝试存储的值?

例如,对于异常:.MySQLTransactionRollbackException: Deadlock found when trying to get lock;

查询SHOW ENGINE INNODB STATUS 很有用...

【问题讨论】:

    标签: java mysql exception


    【解决方案1】:

    除了 SQLSTATE 和相应的 MySQL 错误代码和消息之外,通过 JDBC 提供的调试信息非常少。

    https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html


    对于第一个异常,最可能的解释是它是由 MySQL 在尝试将负值存储到 UNSIGNED 整数数据类型时引发的警告(或错误)引起的。

    举个例子:

    CREATE TABLE foo (val BIGINT UNSIGNED);
    INSERT INTO foo (val) VALUES (-4);
    
    0 row(s) affected
    Total Time     : 0.030 sec
    --------------------------------------------------
    
    1 row(s) affected, 1 warning(s)
    Total Time     : 0 sec
    
    Warning Code : 1264
    Out of range value for column 'val' at row 1
    

    对于另一个异常,这是有关正在引发的 MySQL 错误的信息:

    Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)
    Message: Deadlock found when trying to get lock; try restarting transaction
    

    对于 InnoDB 表遇到的错误,是的,SHOW ENGINE INNODB STATUS 语句的输出可以提供一些见解。但该信息是针对整个数据库的,不一定特定于遇到错误的会话。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2010-10-09
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多