Java DatabaseMetaData.getSchemas()返回空结果集,应为非空结果集

Java DatabaseMetaData.getSchemas()返回空结果集,应为非空结果集,java,mysql,jdbc,database-metadata,Java,Mysql,Jdbc,Database Metadata,试图了解这里发生了什么。DatabaseMetaData正在返回一个空结果集,而实际上相同的SQL查询不会返回空结果集。这不是一个主要问题,因为我使用第二个代码示例作为解决方法 DatabaseMetaData dmd = this.connection.getMetaData(); ResultSet rs = dmd.getSchemas(); while (rs.next()){ // empty result set } 应为非空结果集 ResultSet rs = this.co

试图了解这里发生了什么。DatabaseMetaData正在返回一个空结果集,而实际上相同的SQL查询不会返回空结果集。这不是一个主要问题,因为我使用第二个代码示例作为解决方法

DatabaseMetaData dmd = this.connection.getMetaData();
ResultSet rs = dmd.getSchemas();
while (rs.next()){
  // empty result set
}
应为非空结果集

ResultSet rs = this.connection.prepareStatement("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;").executeQuery();
while (rs.next()){
  // non-empty result set with expected results
}
应为非空结果集,并已获取该结果集


据我所知,MySQL JDBC驱动程序认为是目录,而不是模式。因此,您应该改为使用(无论在哪里使用它,都需要使用catalog参数,而不是schema参数)

始终返回空的结果集:

public java.sql.ResultSet getSchemas() throws SQLException {
    Field[] fields = new Field[2];
    fields[0] = new Field("", "TABLE_SCHEM", java.sql.Types.CHAR, 0);
    fields[1] = new Field("", "TABLE_CATALOG", java.sql.Types.CHAR, 0);

    ArrayList<ResultSetRow> tuples = new ArrayList<ResultSetRow>();
    java.sql.ResultSet results = buildResultSet(fields, tuples);

    return results;
}

我意识到这是一篇老文章,但它出现在谷歌搜索这个主题时,这里的答案对我来说并不适用

经过更多的挖掘,我找到了正确的方法

首先,通过这样做,您可以获得所有元数据表类型的列表

    DatabaseMetaData metaData = connection.getMetaData();
    ResultSet rs = metaData.getTableTypes();
    while (rs.next()) {
        System.out.println(rs.getString(1));
    }
我们感兴趣的表类型简称为

这段代码将在SQL server中调出模式的所有名称,前提是您的凭据有权查看它们

    DatabaseMetaData metaData = connection.getMetaData();
    ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"});
    while(rs.next())
    {
        System.out.println(rs.getString(1));
    }

不管怎样,Java 8和mysql-connector-Java-8.0.22对我来说都很有用。有趣的是,这应该被认为是一个bug吗?这似乎意味着它应该返回一个带有sechema名称的ResultSet。@MichaelHobbs可能不是,架构和目录的定义在不同的数据库系统中是不同的。MySQL所称的模式更像是SQL标准中定义的目录。令人困惑的是,术语与MySQL中使用的内容不一致。我填写了一份bug报告,他们回来后基本上说这是一个长期存在的问题,可以追溯到早期。正如您所说,归根结底是如何定义模式/目录的。看起来仍然很奇怪,它们会有一个基本不起任何作用的函数。@MichaelHobbs我想使用
getCatalog
的决定早于信息模式的MySQL实现,并调用数据库模式而不是目录。很难扭转这样的决定,因为它会破坏已经依赖它的应用程序。JDBC规范明确指出,不存在或不受支持的元数据应返回空结果集。
    DatabaseMetaData metaData = connection.getMetaData();
    ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"});
    while(rs.next())
    {
        System.out.println(rs.getString(1));
    }