mysql/jdbc:设置useInformationSchema=true读取表注释信息(table_comment)

问题描述

今天在读取表的注释信息(COMMENT)时,发现返回的REMARKS字段返回居然是null. 以下是代码示例:

DatabaseMetaData meta = this.pConnection.getMetaData();
// 获取所有表信息
ResultSet resultSet = this.meta.getTables(this.catalog, tableSchema, pattern, this.tableTypes);
while (resultSet.next()) {
    Table table = new Table();
    # 返回null
    String comment=resultSet.getString("REMARKS");
}
resultSet.close();

原因分析

google找了半天,总算知道原因: Connector/J 5.0.0以后的版本有一个名为useInformationSchema的数据库连接参数, 在默认连接参数情况下,useInformationSchema=false,导致Connection.getMetaData()方法返回的DatabaseMetaData 对象是com.mysql.jdbc.DatabaseMetaData,而不是com.mysql.jdbc。DatabaseMetaDataUsingInfoSchema, DatabaseMetaDataUsingInfoSchemaDatabaseMetaData是的子类,看名称就能联想到是通过 INFORMATION_SCHEMA 数据库获取数据库的metadata,可以正确返回table_comment字段。

下面是useInformationSchema的官方说明

useInformationSchema When connected to MySQL-5.0.7 or newer, should the driver use the INFORMATION_SCHEMA to derive information used by DatabaseMetaData? Default: false Since version: 5.0.0 摘自《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

而父类DatabaseMetaData并不一定能正常返回table_comment字段.

关于INFORMATION_SCHEMA 这里不深入探讨,参见《Chapter 24 INFORMATION_SCHEMA Tables》

解决方法

解决的方法也很简单: 数据库连接时设置useInformationSchema=true 如何设置数据库连接参数呢?有两个途径

方法一:java代码实现

# 将所有参数装入java.util.Properties 对象
Properties props = new Properties();
props.setProperty("username",this.username);
props.setProperty("password",this.password); 
props.setProperty("useInformationSchema", "true");
# 调用getConnection(String,Properties)方法创建连接
this.pConnection = java.sql.DriverManager.getConnection(this.url, props);

方法二:连接url参数

直接将参数加到数据库连接url,如下代码中在数据连接url中添加了两个参数characterEncoding=utf8useInformationSchema=true

String url="jdbc:mysql://localhost:3306/test?characterEncoding=utf8&&useInformationSchema=true"
this.pConnection = DriverManager.getConnection(this.url, this.username,this.password);

关于mysql 连接URL的语法参见: 《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

参考资料

《Connector/J does not retrieve the table comment in a InnoDB table》 《Retrieve mysql table comment using DatabaseMetaData》 《Chapter 24 INFORMATION_SCHEMA Tables》 《5.1 Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

SqlServer 索引

什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查...

3959
来自专栏互联网技术栈

MySQL EXPLAIN详解

MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。

1699
来自专栏技术之路

sqlserver 各种判断是否存在(表名、函数、存储过程.......)

库是否存在 if exists(select * from master..sysdatabases where name=N'库名') print 'exi...

20410
来自专栏杨建荣的学习笔记

一个MySQL优化案例的初步思路(r8笔记第87天)

今天想起这件同事处理的一个性能优化案例,当时虽然解决了,但是还是留下了几个未解的问题,和大家一起讨论一下。 首先,这个问题是根据反馈sql响应很慢,已经开始影响...

2834
来自专栏张善友的专栏

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft ...

3468
来自专栏性能与架构

Mysql Join的实现原理

在MySQL中,只有一种Join算法,就是大名鼎鼎的NestedLoop Join 对左表进行遍历,拿一条数据和右表的每条数据进行比对,如果找到N条匹配的,此条...

4346
来自专栏java学习

数据库介绍以及使用

第1章 数据库介绍 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以...

3684
来自专栏Java大联盟

Java面试手册:数据库 ④

1173
来自专栏lestat's blog

mysql开发规范

命名规范 库名、表名、字段名必须使用小写字母,并采用下划线分割 库名、表名、字段名禁用超过32个字符。须见名知意 库名、表名、字段名禁用使 MySQL保留字 临...

45717
来自专栏积累沉淀

Oracle、 Mysql 、 SQLserver 分页查询

MYSQL 分页最简单了. SELECT * FROM Account  WHERE (usertype='base' or usertype=...

6095

扫码关注云+社区

领取腾讯云代金券