PostgreSQL JDBC Driver在查询中为文字返回1111类型

时间:2016-03-15 13:48:24

标签: postgresql jdbc

我遇到了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。

1 个答案:

答案 0 :(得分:0)

当你使用这样的文字时,这不是PgJDBC问题:

select id, 'ff' from testable

对于PostgreSQL是未知类型,所以它映射到Types.OTHER,如果你真的想把它作为 varchar 处理,你应该把它投射:

select id, 'ff'::varchar from testable

更新: PostgreSQL 10改变了这种行为,现在它返回文本OID,映射到 Types.VARCHAR