在java中从mysql获取表元数据

Posted

技术标签:

【中文标题】在java中从mysql获取表元数据【英文标题】:Obtaining Table metadata from mysql in java 【发布时间】: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 语句的情况下做到这一点。

谢谢

【问题讨论】:

【参考方案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

【讨论】:

我知道我可以在运行选择查询后从结果集中获取元数据,但我想知道除了在表上运行选择查询之外是否还有其他方法。

以上是关于在java中从mysql获取表元数据的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 临时表复制表元数据

MySQL 临时表复制表元数据

“无法获取表元数据”“从 NDBCLUSTER 收到错误 157‘未知错误代码’”

数据库表元数据管理与监控

当使用 32 位版本的 MySQL 的 .net 连接器连接到 64 位版本的 MySQL 时,我得到“等待表元数据锁定”

Bigquery 表元数据:类型 2 表为空但可查询