【问题标题】:Tinyint returning as BIT in DatabaseMetaData JAVATinyint 在 DatabaseMetaData JAVA 中返回为 BIT
【发布时间】:2018-12-17 21:38:57
【问题描述】:

MySql tinyint 在 java 中返回为 BIT,列大小返回为 null。对于其他数据类型,它工作正常。有什么解决办法吗?

Class clsObj = Class.forName(className);
AbstractEntityPersister classMetadata = (AbstractEntityPersister) getSessionFactory().getClassMetadata(clsObj);
String[] properties = classMetadata.getPropertyNames();
String tableName = classMetadata.getTableName();

Map<String, String> dbFieldToPojoFieldMap = new HashMap<String, String>();
for (String prop : properties) {
    String[] names = classMetadata.getPropertyColumnNames(prop);
    dbFieldToPojoFieldMap.put(names[0], prop);
}

DatabaseMetaData meta = con.getMetaData();
ResultSet rsColumns = meta.getColumns(null, null, tableName, null);

while (rsColumns.next()) {
    Map<String, String> columnMetaData = new HashMap<String, String>();
    String columnName = rsColumns.getString(Constants.COLUMN_NAME);
    String columnType = rsColumns.getString(Constants.TYPE_NAME);
    String columnSize = rsColumns.getString(Constants.COLUMN_SIZE);
    String decimalDigits = rsColumns.getString(Constants.DECIMAL_DIGITS);
}

【问题讨论】:

  • 我无法用 mysql-connector-java-5.1.46 重现您的问题。对我来说,.getColumns 分别返回TINYINT30 对应TYPE_NAMECOLUMN_SIZEDECIMAL_DIGITS。能否提供minimal reproducible example以及具体的版本信息(驱动版本、服务器版本等)?
  • 什么是 MySQL 版本?您使用的是什么 JDBC 驱动程序?

标签: java mysql hibernate jdbc


【解决方案1】:

我们遇到了类似的问题。看起来较新版本的 MySQL(即 5.0.6 后,如 8)定义了一个 BIT 列类型,它是 TINYINT(1) 的别名。此外,还引入了BOOLBOOLEAN。为了为我们解决这个问题,我们决定使用 java 连接字符串选项"tinyInt1isBit=false" 来正确报告我们正确定义的TINYINT 列。我们不使用BIT。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2014-10-15
    • 2010-09-22
    • 2012-05-19
    • 2018-11-07
    • 2013-01-18
    • 2023-03-30
    • 2012-12-01
    • 2012-07-21
    相关资源
    最近更新 更多