1 mysql bigint unsigned vs java.lang.Long
在 MySQL 数据库中,UNSIGNED BIGINT
可表示的范围是 0 到 18,446,744,073,709,551,615。在 Java 中,long
类型的取值范围是 -9,223,372,036,854,775,808
到 9,223,372,036,854,775,807
,不能完全覆盖 UNSIGNED BIGINT
的范围。
2 java处理数据库中的 UNSIGNED BIGINT
类型
在处理数据库中的 UNSIGNED BIGINT
类型时,不同的场景可能需要不同的处理方式。以下是如何在 Java 中针对 B 端和 C 端业务处理 UNSIGNED BIGINT
类型的数据。
2.1 B 端业务场景
在 B 端业务中,如果业务主键使用 UNSIGNED BIGINT
类型且当前实际使用范围远未达到 LONG
类型的上限(92,233,720,368.55 亿),可以使用 Long
类型承接。
例如,假设一个商家管理系统的商家表的主键 ID 是 UNSIGNED BIGINT
,但考虑到当前中国的企业数量大约是一亿左右,用 Long
类型来承接是足够的。
2.2 C 端业务场景
在 C 端业务中,特别是像订单 ID 这样高速增长的情况,UNSIGNED BIGINT
的范围可能会超过 LONG
类型的上限。在这种情况下,需要使用 java.math.BigInteger
来处理。
示例代码
import java.sql.*;
import java.math.BigInteger;
public class C端Example {
public static void main(String[] args) {
// 假设你已经获取了一个数据库连接对象 connection
Connection connection = null; // 请初始化你的数据库连接
try {
// 创建一个Statement对象来执行SQL查询
Statement stmt = connection.createStatement();
// 执行查询
ResultSet rs = stmt.executeQuery("SELECT order_id FROM orders");
while (rs.next()) {
// 从结果集中读取 UNSIGNED BIGINT 列的值
String orderIdStr = rs.getString("order_id");
// 将字符串转换为 BigInteger
BigInteger orderId = new BigInteger(orderIdStr);
// 现在你可以在 Java 中使用 BigInteger 来处理 UNSIGNED BIGINT
System.out.println("Retrieved order_id: " + orderId);
}
// 关闭结果集和语句
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在这个示例中:
- 使用
ResultSet.getString
方法获取数据库中存储的UNSIGNED BIGINT
值,以字符串的形式读取。 - 使用
BigInteger
构造函数将字符串转换为BigInteger
实例。
这样可以确保你能够正确处理范围超出 long
范围的无符号大整数。
通过这种方式,你可以根据不同的业务需求选择合适的 Java 数据类型来处理 UNSIGNED BIGINT
。
3 数据库主键设置成int/bigint unsigned的好处
在数据库和应用系统设计中,减少数据库消耗和优化性能是非常重要的。在你的例子中,如果主键或者某些字段不可能是负数,可以使用 unsigned 类型来表示它们,这样不仅可以表示更大的正数范围,还可以减少负数检查的额外开销。
关于减少数据库消耗,你可以从多个角度进行优化:
数据类型选择:为列选择合适的数据类型,确保其足够小以节省存储空间,但也要足够大以适应将来的增长。例如,如果你确定一个字段不会为负数,可以使用 unsigned 类型。
以下是一些具体的实现建议:
在数据库 schema 设计时,如果确定某些整数列(如主键、计数器等)不可能是负数,可以使用 unsigned 类型来避免不必要的负数检查,同时也可以增加正数能表示的最大范围。