我遇到了PostgreSQL JDBC Driver的问题。我创建了一个包含一列的简单表,添加了三行并查询它:
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver").newInstance();
Connection Conn = DriverManager.getConnection("jdbc:postgresql://localhost/test?user=user&password=password");
Statement Stmt = Conn.createStatement();
String sqlCommand = "select id, 'ff' from testable";
ResultSet RS = Stmt.executeQuery(sqlCommand);
final ResultSetMetaData meta = RS.getMetaData();
while (RS.next()) {
System.out.println(meta.getColumnType(2)+ " " +RS.getString(2));
}
// Clean up after ourselves
RS.close();
Stmt.close();
Conn.close();
}
catch (SQLException E) {
System.out.println("SQLException: " + E.getMessage());
System.out.println("SQLState: " + E.getSQLState());
System.out.println("VendorError: " + E.getErrorCode());
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
输出结果为:
1111 ff
1111 ff
1111 ff
PostgreSQL JDBC驱动程序返回1111元数据代码,它对应java.sql.Types.OTHER,而不是VARCHAR(代码为12)。 例如,MySQL驱动程序的相同脚本返回:
12 ff
12 ff
12 ff
我的问题是 - 为什么PostgreSQL会为文字返回Types.OTHER?有没有办法在所有常见的JDBC驱动程序(mysql,postgre,mssql,oracle)中正确获取类型?
驱动程序版本为9.4.1208.jre7。
答案 0 :(得分:0)
当你使用这样的文字时,这不是PgJDBC问题:
select id, 'ff' from testable
对于PostgreSQL是未知类型,所以它映射到Types.OTHER,如果你真的想把它作为 varchar 处理,你应该把它投射:
select id, 'ff'::varchar from testable
更新: PostgreSQL 10改变了这种行为,现在它返回文本OID,映射到 Types.VARCHAR 。