Java MySQL JDBC驱动程序在返回生成的密钥时错误地将bigint报告为biginger
我正在处理一个令人沮丧的问题。MySQL(与大多数SQL数据库一样)不将其64位整数数据类型称为“long”。这是一个“bigint”。好的 但是MySQL JDBC驱动程序(8.0.22)错误地将此列返回为java.math.biginger,而实际情况并非如此 是的,我可以在我的应用程序代码中将BigInteger转换为long,但是由于一些内部的、特定于应用程序的原因,这确实很不方便 有没有办法强制驱动程序返回正确的数据类型,即java.lang.Long 更新 根据注释,是的,常规select语句确实以java.lang.Long返回列。我的错 它失败的地方是在插入后返回生成的键。在这里,列返回为BigInteger。代码如下: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
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()
获得一个JavaLong
。“你能在你的问题中显示更多的上下文吗?或者是一个例子?”安德烈·詹姆斯补充道。问题似乎仅限于返回生成的密钥。我的错误。现在我可以重现这个行为了,谢谢你-但不幸的是,我无法解释它。