Я использую 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)
Что Как мы можем смягчить эту проблему?