【发布时间】:2018-12-30 20:41:59
【问题描述】:
所以我有以下问题。 我有一个通过 jdbc 连接到 Redshift-DB 的 Java 应用程序。执行一个简单的 SELECT 查询会产生一个不为空的 ResultSet(我检查过)。
现在,当我尝试从此 ResultSet 中提取数据时,该方法有时会返回 null,即使之前的 ResultSet.wasnull() 返回 false 并且在数据库中手动检查也显示有问题的记录不包含该属性的空值。
示例代码:
private void test(){
ResultSet rs = null;
ResultSetMetaData rsmd = null;
String getTable = "SELECT * from myTable"; //
try(PreparedStatement prep = myConnection.prepareStatement(getTable
, ResultSet.TYPE_FORWARD_ONLY
)){
rs = prep.executeQuery();
rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
while(rs.next()){ // loop over all rows
for(int col = 1; col <= columns; col++){
if(rs.wasNull())
System.out.println("NULL Value detected!");
System.out.println("Column Name: " + rsmd.getColumnName(col));
System.out.println("Column value: " + rs.getString(col));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
这在大多数情况下都有效,除了某些记录之外,rs.getString(col) 只会产生空值(即使数据库中的数据类型是 CHAR 或 VARCHAR)。这不一定发生在所有列上(我已经看到有几列被正确读取和打印,直到最终出现 null,即使 wasnull() 返回 false。
到目前为止,我已经观察到 ResultSet.getString()、ResultSet.getDate() 和 ResultSet.getTimestamp() 的这种行为,但在提取任何类型的数字 (getInt()...) 时从未观察到。在所有这些情况下,我检查了数据库以确保 jdbc 方法与数据类型匹配。
我尝试使用不同的驱动程序版本,我尝试使用 rs.getBytes(col) 代替,但结果仍然相同:我只是无法摆脱那些空值。
我还成功地进行了 UNLOAD 操作,将麻烦的表卸载到 S3 并手动检查导出的 csv 文件。 UNLOAD 运行没有任何问题,CSV 对我来说看起来不错(所有值都符合预期)。
现在我当然可以通过跳过它们发生的记录来手动处理那些“不需要的 NULL”,但我宁愿避免在不了解其原因的情况下掩盖这个错误。
所以我的问题是:
我在我的代码中做一些根本错误的事情吗? jdbc / Redshift 是否存在可能导致此问题的已知问题? 有人可以向我指出一些来源或给我一些关于我可以尝试什么的想法吗?
【问题讨论】:
标签: java jdbc amazon-redshift