【问题标题】:Obtaining Table metadata from mysql in java在java中从mysql获取表元数据
【发布时间】:2012-02-15 14:06:18
【问题描述】:

有没有办法在第一次对表执行选择查询之前获取表元数据?

重述:有没有办法为数字类型(int、tinyint、bigint 等)获取特定数据行和列的列大小?

DatabaseMetaData md = connection.getMetaData();
ResultSet rs = dbmd.getColumns(null, null, tableName, "%");

我不能使用上面的代码作为数字类型的COLUMN_SIZE (int,tinyint,bigint,etc) 将返回这些类型的最大允许大小。我需要获取 columnDisplaySize。

上面的代码将为int(8)返回10,但我需要8,我可以从表的resultMetaData中得到。

那么有没有办法在不先运行 select 语句的情况下做到这一点。

谢谢

【问题讨论】:

    标签: java mysql jdbc mysql-connector


    【解决方案1】:

    对于INT(8),你应该知道8不是大小限制。这是 MySQL 用户常见的误解。类似 INT 的数据类型的参数只是一个提示,如果它们的位数少于参数,则 SQL 填充值。它通常仅用于 ZEROFILL。

    CREATE TABLE foo ( i1 INT(8) ZEROFILL, i2 INT(16) ZEROFILL );
    INSERT INTO foo VALUES (1234, 1234);
    SELECT * FROM foo;
    +----------+------------------+
    | i1       | i2               |
    +----------+------------------+
    | 00001234 | 0000000000001234 | 
    +----------+------------------+
    

    值 8 与 16 不会改变 INT 所需的存储空间,也不会改变它支持的值范围。 INT 数据类型始终为 32 位,并且始终允许从 -231 到 231-1 的值,无论您提供什么参数。

    同样,TINYINT 始终为 8 位,SMALLINT 始终为 16 位,MEDIUMINT 始终为 24 位,BIGINT 始终为 64 位。

    您得到的 10 值是数字精度,而不是大小限制。也就是说,一个 32 位的值在以 base-10 显示时最多可以使用 10 位:

    SELECT LENGTH(POW(2,31));
    +-------------------+
    | LENGTH(POW(2,31)) |
    +-------------------+
    |                10 | 
    +-------------------+
    

    【讨论】:

      【解决方案2】:

      正如@technocrat 所说,在 information_schema 上检查此查询

      SELECT column_name, column_type FROM INFORMATION_SCHEMA.columns where table_schema='[Table schema]' and table_name='[Table Name]'

      【讨论】:

        【解决方案3】:

        我可能不符合您的要求,但是 mysql 命令show columns in <tablename> 有什么用吗? http://dev.mysql.com/doc/refman/5.1/en/show-columns.html 了解更多信息。

        【讨论】:

          【解决方案4】:

          您可能想查看 MySQL 中的 INFORMATION_SCHEMA 表能够为您提供什么。有时您可以利用它们来发挥自己的优势。我快速浏览了一下,但没有立即从那里击中我。

          MySQL 信息架构:http://dev.mysql.com/doc/refman/5.6/en/information-schema.html

          【讨论】:

            【解决方案5】:

            参考以下文章:

            将帮助您了解从 JDBC 元数据获取表中的示例

            http://roseindia.net/jdbc/Jdbc-meta-data-get-tables.shtml

            【讨论】:

            • 我知道我可以在运行选择查询后从结果集中获取元数据,但我想知道除了在表上运行选择查询之外是否还有其他方法。
            猜你喜欢
            • 1970-01-01
            • 2012-08-16
            • 2019-03-15
            • 1970-01-01
            • 1970-01-01
            • 2015-11-12
            • 2018-11-01
            • 2020-09-01
            • 1970-01-01
            相关资源
            最近更新 更多