在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获取表元数据的主要内容,如果未能解决你的问题,请参考以下文章
“无法获取表元数据”“从 NDBCLUSTER 收到错误 157‘未知错误代码’”
当使用 32 位版本的 MySQL 的 .net 连接器连接到 64 位版本的 MySQL 时,我得到“等待表元数据锁定”