Несоответствие типов данных: тип -4 с MySQL 5.1.47 и CachedRowSetImpl - PullRequest
0 голосов
/ 04 марта 2020

Я использую Java с MySQL Connector / J 5.1.47 для подключения к базе данных 5.0.96 MySQL (я пробовал с другими базами данных).

Вот MWE :

 public static void main (String[] args) throws SQLException {
    MysqlDataSource dataSource = new MysqlDataSource();
    dataSource.setUser("user");
    dataSource.setPassword("password");
    dataSource.setURL("jdbc:mysql://database:3306/dbname");

    try (Connection connection = dataSource.getConnection()) {

        CachedRowSet cachedRowSet = new CachedRowSetImpl();
        try (PreparedStatement preparedStatement =
         connection.prepareStatement("SELECT BLOB_FIELD FROM MY_TABLE")) {
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                cachedRowSet.populate(resultSet);
            }

            while (cachedRowSet.next()) {
                System.out.println(cachedRowSet.getBlob(1));
            }
        }
    }
}

Вывод ошибки:

Type is : -4
Exception in thread "main" java.sql.SQLException: Datatype mismatch
    at com.sun.rowset.CachedRowSetImpl.getBlob(CachedRowSetImpl.java:5794)
    at Scratch.main(scratch_63.java:29)

Если я удаляю CachedRowSetImpl, я не получаю эту ошибку. Но на производстве, где мы также используем базы данных CachedRowSet и MySQL, мы не получаем эту ошибку. После исследования ошибка выдается этим блоком:

public Blob getBlob(int var1) throws SQLException {
    this.checkIndex(var1);
    this.checkCursor();
    if (this.RowSetMD.getColumnType(var1) != 2004) {
        System.out.println(MessageFormat.format(this.resBundle.handleGetObject("cachedrowsetimpl.type").toString(), this.RowSetMD.getColumnType(var1)));
        throw new SQLException(this.resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
    } else {
        this.setLastValueNull(false);
        Blob var2 = (Blob)((Blob)this.getCurrentRow().getColumnObject(var1));
        if (var2 == null) {
            this.setLastValueNull(true);
            return null;
        } else {
            return var2;
        }
    }
}

Кажется, это происходит потому, что MySQL переводит тип данных BLOB (2004) в тип данных LONGVARBINARY (-4)

Что Как мы можем смягчить эту проблему?

...