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 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

SQL Server 深入解析索引存储(下)

概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储。 非聚集索引的叶层是由索引...

2727
来自专栏互联网技术栈

MySQL EXPLAIN详解

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

1299
来自专栏禅林阆苑

mysql学习总结04 — SQL数据操作

mysql 中 SELECT 命令类似于其他编程语言的 print 或 write,可用来显示字符串、数字、数学表达式的结果等

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

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

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

2774
来自专栏性能与架构

Mysql Join的实现原理

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

3876
来自专栏从流域到海域

SQL连接查询(最全面)

连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。通过连接运算符可以实现多个表查询。 在关系数据库管理系统中,表建立时各数据之间...

2167
来自专栏张善友的专栏

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

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

2838
来自专栏python学习路

二、Mysq(二)

内置函数 1、字符串函数 查看字符的ascii码值ascii(str),str是空串时返回0 select ascii('a'); 查看ascii码值对应的字符...

3026
来自专栏Django Scrapy

day2 oracle相关

数据库定义有三: 1 一门计算机学科 2 代表某个软件 3 某一种数据库软件产生的集合 DDL 数据库定义语句 DML 数据库操作语句 创建一张表: ...

3069
来自专栏岑玉海

SqlServer 索引

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

3319

扫码关注云+社区