关于主键设置为bigint unsigned,在java中用什么承接呢?

11 篇文章 0 订阅
5 篇文章 0 订阅

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,8089,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 CExample {
    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();
        }
    }
}

在这个示例中:

  1. 使用 ResultSet.getString 方法获取数据库中存储的 UNSIGNED BIGINT 值,以字符串的形式读取。
  2. 使用 BigInteger 构造函数将字符串转换为 BigInteger 实例。

这样可以确保你能够正确处理范围超出 long 范围的无符号大整数。

通过这种方式,你可以根据不同的业务需求选择合适的 Java 数据类型来处理 UNSIGNED BIGINT

3 数据库主键设置成int/bigint unsigned的好处

在数据库和应用系统设计中,减少数据库消耗和优化性能是非常重要的。在你的例子中,如果主键或者某些字段不可能是负数,可以使用 unsigned 类型来表示它们,这样不仅可以表示更大的正数范围,还可以减少负数检查的额外开销

关于减少数据库消耗,你可以从多个角度进行优化:
数据类型选择:为列选择合适的数据类型,确保其足够小以节省存储空间,但也要足够大以适应将来的增长。例如,如果你确定一个字段不会为负数,可以使用 unsigned 类型。

以下是一些具体的实现建议:
在数据库 schema 设计时,如果确定某些整数列(如主键、计数器等)不可能是负数,可以使用 unsigned 类型来避免不必要的负数检查,同时也可以增加正数能表示的最大范围。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值