在 java 中使用 preparedstatement 设置 mysql 的 mediumint 参数,直接调用 setint(int parameterindex, int x) 即可。因为 mediumint 是无符号或带符号的 24 位整数,其取值范围完全包含在 java int(32 位有符号整数)范围内,所以 jdbc 驱动会自动处理类型转换,无需特殊操作。

如何验证 Mediumint 的范围兼容性
MEDIUMINT 占用 3 个字节,有符号范围是 -8388608 到 8388607,无符号范围是 0 到 16777215。Java 的 int 范围是 -2147483648 到 2147483647,因此所有合法的 MEDIUMINT 值都能无损地放入 Java int 中。开发者只需确保传入的值不超出 MEDIUMINT 的物理限制,JDBC 驱动会在发送 SQL 时将其作为整数处理。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class MediumintTest {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
// 测试最大值和最小值
int maxVal = 16777215; // MEDIUMINT UNSIGNED MAX
int minVal = -8388608; // MEDIUMINT SIGNED MIN
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "INSERT INTO test_table (medium_col) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置无符号最大值
pstmt.setInt(1, maxVal);
pstmt.executeUpdate();
// 设置带符号最小值
pstmt.setInt(1, minVal);
pstmt.executeUpdate();
System.out.println("Values inserted successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}上述代码展示了如何将 MEDIUMINT 的边界值通过 setInt 插入数据库。如果传入的值超过 MEDIUMINT 范围(例如 20000000),MySQL 会报错或截断(取决于 SQL 模式),但 Java 端不会抛出异常,因为 int 能容纳该值。
立即学习“Java免费学习笔记(深入)”;
Mediumint 与 Int 在 JDBC 中的映射差异
虽然 setInt 适用于 MEDIUMINT,但理解其与 INT 的区别有助于避免逻辑错误。INT 是 32 位,MEDIUMINT 是 24 位。在 JDBC 元数据中,DatabaseMetaData.getColumnType() 返回的 Types.MEDIUMINT 常量(值为 -7)可用于识别列类型,但设置参数时无需区分,统一使用 setInt 即可。若使用 setLong 也可以,但没必要,因为 MEDIUMINT 不需要 64 位精度。

import java.sql.*;
public class MetaDataCheck {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getColumns(null, null, "test_table", "medium_col");
if (rs.next()) {
int type = rs.getInt("DATA_TYPE");
System.out.println("Column Type: " + type); // Should be -7 for MEDIUMINT
System.out.println("TypeName: " + rs.getString("TYPE_NAME"));
}
}
}
}运行此代码可确认数据库中列的实际类型。即使类型为 MEDIUMINT,设置参数时仍使用 setInt。若误用 setShort(16 位),则可能溢出,因为 MEDIUMINT 最大值 16777215 远超 short 的 32767。
当 Mediumint 为无符号时如何处理负数
如果 MEDIUMINT 列定义为 MEDIUMINT UNSIGNED,则不能插入负数。此时若 Java 代码尝试插入负数,MySQL 会拒绝或转换为 0(取决于配置)。开发者应在 Java 层做校验,确保非负值。例如,若业务逻辑允许负数,但数据库列为无符号,则需调整表结构或在应用层拦截。以下代码演示了校验逻辑:
public void insertMediumint(Connection conn, int value) throws SQLException {
String sql = "INSERT INTO test_table (medium_col) VALUES (?)";
if (value < 0) {
throw new IllegalArgumentException("MEDIUMINT UNSIGNED cannot accept negative values");
}
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, value);
pstmt.executeUpdate();
}
}此方法确保了数据一致性。若列是有符号的,则无需此检查。总之,setInt 是设置 MEDIUMINT 的标准方式,关键在于值域校验而非类型转换。


















