Java MySQL JDBC驱动程序在返回生成的密钥时错误地将bigint报告为biginger

Java MySQL JDBC驱动程序在返回生成的密钥时错误地将bigint报告为biginger,java,mysql,jdbc,Java,Mysql,Jdbc,我正在处理一个令人沮丧的问题。MySQL(与大多数SQL数据库一样)不将其64位整数数据类型称为“long”。这是一个“bigint”。好的 但是MySQL JDBC驱动程序(8.0.22)错误地将此列返回为java.math.biginger,而实际情况并非如此 是的,我可以在我的应用程序代码中将BigInteger转换为long,但是由于一些内部的、特定于应用程序的原因,这确实很不方便 有没有办法强制驱动程序返回正确的数据类型,即java.lang.Long 更新 根据注释,是的,常规sel

我正在处理一个令人沮丧的问题。MySQL(与大多数SQL数据库一样)不将其64位整数数据类型称为“long”。这是一个“bigint”。好的

但是MySQL JDBC驱动程序(8.0.22)错误地将此列返回为java.math.biginger,而实际情况并非如此

是的,我可以在我的应用程序代码中将BigInteger转换为long,但是由于一些内部的、特定于应用程序的原因,这确实很不方便

有没有办法强制驱动程序返回正确的数据类型,即java.lang.Long

更新

根据注释,是的,常规select语句确实以java.lang.Long返回列。我的错

它失败的地方是在插入后返回生成的键。在这里,列返回为BigInteger。代码如下:

public static void main(String[] args) throws SQLException {

    Connection conn = DriverManager
            .getConnection("jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&user=root");

    Statement state = conn.createStatement();
    state.executeUpdate("drop table if exists foo");
    state.executeUpdate("create table foo (id bigint auto_increment, name varchar(255), primary key(id))");
    state.executeUpdate("insert into foo (name) values ('bob')", Statement.RETURN_GENERATED_KEYS);

    ResultSet rs = state.getGeneratedKeys();
    rs.next();

    Object obj = rs.getObject(1);

    System.out.println(obj);
    System.out.println(obj.getClass());

    conn.close();

}
返回:

1
class java.math.BigInteger

MySQL列是否定义为
BIGINT
BIGINT UNSIGNED
?根据上的表6.2,这决定了Java类型(它将是一个
长的
,除非您使用的是
无符号的
——在这种情况下,它将是一个
大整数
)。@andrewjames这是一个bug。我正在创建列为“bigint autoincrement”。也许是自动递增迫使它未签名,但它不应该。我无法重现您的问题。使用带有自动递增(但不是无符号)的
BIGINT(20)
,我将从
ResultSetMetaData.getColumnClassName()
获得一个Java
Long
。“你能在你的问题中显示更多的上下文吗?或者是一个例子?”安德烈·詹姆斯补充道。问题似乎仅限于返回生成的密钥。我的错误。现在我可以重现这个行为了,谢谢你-但不幸的是,我无法解释它。