从Java中的PostgreSQL元数据中检索字段大小

时间:2018-03-08 17:29:31

标签: java postgresql database-metadata

此Java代码适用于DB2数据库和PostgreSQL数据库。

rs = stmt.executeQuery(qry);                            
rsMetaData = rs.getMetaData();                          
numCols = rsMetaData.getColumnCount();                  
say("resultSet MetaData column Count=" + numCols);

但是当我要求任何列的大小时,我得到一个不可能的大数字用于PostgreSQL

width = rsMetaData.getColumnDisplaySize(col); 

DB2返回准确的列大小,但PostgreSQL给出了这个:

table_catalog POSITION(1) varchar(2147483647)                                     

驱动程序是org.postgresql.Driver - postgresql-9.2-1002.jdbc4.jar

为表中的所有列返回此大小(2147483647)。这是PostgreSQL或Java ResultSetMetaData中的错误吗?如何在PostgreSQL中获得真正的列宽?

2 个答案:

答案 0 :(得分:1)

使用ResultSet.getPrecision()

来自the JavaDocs

  

获取指定列的指定列大小。对于数字数据,这是最大精度。 对于字符数据,这是字符的长度。

(强调我的)

但是根据我的经验,并非所有JDBC驱动程序都采用相同的方式。对于某些getColumnDisplaySize()更准确,对于其他人getPrecision()会返回正确的信息。

JavaDocs for getColumnDisplaySize() 州:

  

表示指定列的正常最大宽度(字符)。

这表明这更像是驱动程序对列的宽度的暗示。

答案 1 :(得分:0)

以下是我处理这种情况的方法。首先,我通过整个表读取并获得每列的最大宽度。然后我按顺序重新读取表格,并用它的最大宽度显示每个字段。 rightPad()填充空格以使字符串大小合适。所有的领域现在都很好地排列,正如他们应该的那样。太糟糕了,PostgreSQL没有这样做,或者只是在每种情况下抛出max varchar。

while(rs.next()) {                             
    line=""; cnt++;                                          
    for (int col=1; col<=numCols; col++){                    
        fld = rs.getString(col);                             
        if (fld != null && !fld.isEmpty() &&                 
            widÝcol¨<fld.length()){widÝcol¨=fld.length();}   
    } 
> 
> rs = stmt.executeQuery(qry); // restart the query                           
cnt=0;                                                  
while(rs.next() & cnt < 10000) {                        
      line=""; cnt++;                                   
      for (int col=1; col<=numCols; col++){             
          fld = rightPad(rs.getString(col), widÝcol¨);  
          line = line + fld + " ";                      
      }                                                 
say(line + "\n");