转自: https://blog.csdn.net/10km/article/details/77389038

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();# 返回nullString comment=resultSet.getString("REMARKS");
}
resultSet.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

原因分析

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

方法二:连接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);
  • 1
  • 2

关于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》

转: databasemetadata 无法获取数据库表备注的解决方法相关推荐

  1. Java获取数据库表的字段信息,及如何将ResultSet转为json

    为什么80%的码农都做不了架构师?>>>    一.Java获取数据库表的各个字段的相关信息 在某些开发情景中,需要获取数据库中表的各个字段的相关信息,如字段名,字段类型,字段大小等 ...

  2. ASP获取数据库表名,字段名以及对字段的一些操作

    最近,在ASP论坛上看到很多网友问怎么获取数据库表名,字段名以及如何对字段进行删除,增添的操作故写此文. 本人对SQLServer比较熟一些,故以SQLServer为列:    <%       ...

  3. springboot结合注解动态获取数据库表

    springboot结合注解动态获取数据库表 1 对于分表的处理,可以通过Mybatis-Plus动态表名插件(DynamicTableNameInnerInterceptor)来实现,实现的思路主要 ...

  4. php 获取数据库中的信息,php获取数据库中数据的实现方法

    废话不多说,直接上代码 header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "lo ...

  5. informix 数据库锁表分析和解决方法

    informix 数据库锁表分析和解决方法 参考文章: (1)informix 数据库锁表分析和解决方法 (2)https://www.cnblogs.com/kongzhongqijing/arti ...

  6. 获取库中的所有字段的描述/获取某个表中所有字段方法

    --获取库中的所有字段的描述 SELECT      [Table Name] = OBJECT_NAME(c.object_id),     [Column Name] = c.name,     ...

  7. 总结 db visualizer连接GBase8s数据库报-908错误解决方法

    总结 db visualizer连接GBase8s数据库报-908错误解决方法 检查数据库实例是否正常运行:在服务器端使用informix用户执行命令onstat – 检查dbaccess命令能否正常 ...

  8. mysql锁表_MYSQL锁表问题的解决方法

    本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sq ...

  9. pycharm连接mysql1193错误_pycharm连接mysql数据库提示错误的解决方法_数据库

    忘记phpmyadmin密码怎么重置_数据库 重置phpmyadmin密码的方法是:1.停止mysql服务:2.跳过验证启动mysql:3.重新设置密码:4.更新权限:5.重新启动mysql,如[ki ...

最新文章

  1. NYOJ 287 Radar 贪心之 区间选点
  2. codeforces B. High School: Become Human
  3. 思科、华为交换机的一些命令
  4. RabbitMq 安装
  5. 开发板屏幕截图-适用于本公司海思和智源平台
  6. c_str()的用法
  7. 【月报】Java知音的四月汇总
  8. .net System.IO之Stream的使用详解
  9. 运行时库(runtime library)
  10. python中math isnan_带有Python示例的math.isnan()方法
  11. 朱松纯教授:可解释性是人工智能获得人类信任的关键
  12. 从小码农走到区块链DeFi核心,AC的加密旅程落幕
  13. 多益2980邮箱集合专业游戏服务免费安全的电子邮箱
  14. C语言中system函数用法解释
  15. 总结下我两个移动硬盘坏掉的经历...
  16. 微信小程序开发学习文档(万字总结,一篇搞定前端开发)
  17. 使用ESXCLI将ESXi 6.5或6.7升级到ESXi 7.0
  18. 所示零件是减速器中的传动轴
  19. 基于SSM的在线教育系统的设计与实现【附源码】
  20. 用zt-zip Java库进行zip文件处理

热门文章

  1. HDU - 7072 Boring data structure problem 双端队列 + 思维
  2. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维
  3. Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp
  4. P2480 [SDOI2010]古代猪文(数论好题)
  5. LCS(2021牛客多校4)
  6. 牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊
  7. 洛谷P1650:田忌赛马(贪心)
  8. 粉刷木板(ybtoj-单调队列)
  9. hdu5709-Claris Loves Painting【线段树合并】
  10. P4313-文理分科【最小割】