此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中获得真正的列宽?
答案 0 :(得分:1)
获取指定列的指定列大小。对于数字数据,这是最大精度。 对于字符数据,这是字符的长度。
(强调我的)
但是根据我的经验,并非所有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");