Sql中的BIGINT与Java中的biginger之间的映射

Sql中的BIGINT与Java中的biginger之间的映射,java,sql-server,biginteger,Java,Sql Server,Biginteger,我们面临着这样一个问题:当我们试图用sql中的BigInt映射Java中的biginger时,它的值发生了变化。我们还尝试在映射之前将其转换为longValue,但它也失败了,因为long无法处理其值。我们尝试了toString(),它成功了,但除了使用toString(),还有其他解决方法吗?Java是一个任意长度的整数,仅受可用内存或实现限制,而type只是一个64位有符号整数。一旦BigInteger中存储的值超过2^63-1,您可能会遇到截断 如果处理的值超过有符号64位整数,则需要使用

我们面临着这样一个问题:当我们试图用sql中的
BigInt
映射Java中的
biginger
时,它的值发生了变化。我们还尝试在映射之前将其转换为
longValue
,但它也失败了,因为long无法处理其值。我们尝试了
toString()
,它成功了,但除了使用
toString()
,还有其他解决方法吗?

Java是一个任意长度的整数,仅受可用内存或实现限制,而type只是一个64位有符号整数。一旦BigInteger中存储的值超过2^63-1,您可能会遇到截断


如果处理的值超过有符号64位整数,则需要使用其他方法,例如使用字符串(例如
VARCHAR(MAX)
),或用于存储的字节数组。

Java的
biginger
与SQL Server的
bigint
不对应-尽管名称相似,但它们几乎完全不同:

  • 在Java中,
    biginger
    是一种表示任意精度整数的类型。内部由非稀疏字节向量表示,该向量可随值的增加自由调整大小
  • 在T-SQL中,
    bigint
    表示固定的64位整数。Java等价物是
    long
    。请注意,T-SQL的
    bigint
    和Java的
    long
    都是有符号类型。它是由主机硬件本机处理的值的固有类型
诚然,
biginger
可以表示任何
bigint
值,但反之则不然:您不能将大多数
biginger
值存储在
bigint
列中

正如您在Java中使用
biginger
作为规范值一样,这意味着您不能在表中使用
bigint
,而是应该使用
varbinary(n)
(其中
n
biginger
值大小的合理上限,然后像这样使用它:

yourTableRow.hugeValue = yourBigIntegerValue.toByteArray()
其中,实体类yourTableRow的
hugeValue
成员的类型为
byte[]
,它与T-SQL中的
varbinary(n)
兼容

我建议不要使用
varbinary(MAX)
,因为blob值是如何存储的[1]。您不太可能遇到超过
2^128
(16字节)甚至
2^256
(32字节)的整数值,因此您不需要超过
varbinary(16)
varbinary(32)

如果您知道您的数字不会超过
2^128
,最好将其存储为两个独立的
bigint
(64位)值:

还有一些Java来提取上面的8个字节和下面的8个字节:

byte[] bytes = someBigIntegerValue.toByteArray();
if( bytes.length > 16 ) throw ...

yourRow.hugeValueLower = (long)bytes[ 0] << 56) | 
                         (long)bytes[ 1] << 48) |
                         (long)bytes[ 2] << 40) |
                         (long)bytes[ 3] << 32) |
                         (long)bytes[ 4] << 24) |
                         (long)bytes[ 5] << 16) |
                         (long)bytes[ 6] <<  8) |
                         (long)bytes[ 7]      );
yourRow.hugeValueUpper = (long)bytes[ 8] << 56) |
                         (long)bytes[ 9] << 48) |
                         (long)bytes[10] << 40) |
                         (long)bytes[11] << 32) |
                         (long)bytes[12] << 24) |
                         (long)bytes[13] << 16) |
                         (long)bytes[14] <<  8) |
                         (long)bytes[15]      );
byte[]bytes=someBigIntegerValue.toByteArray();
如果(bytes.length>16)抛出。。。

yourRow.hugeValueLower=(长)字节[0]您使用的是什么ORM或映射程序?
byte[] bytes = someBigIntegerValue.toByteArray();
if( bytes.length > 16 ) throw ...

yourRow.hugeValueLower = (long)bytes[ 0] << 56) | 
                         (long)bytes[ 1] << 48) |
                         (long)bytes[ 2] << 40) |
                         (long)bytes[ 3] << 32) |
                         (long)bytes[ 4] << 24) |
                         (long)bytes[ 5] << 16) |
                         (long)bytes[ 6] <<  8) |
                         (long)bytes[ 7]      );
yourRow.hugeValueUpper = (long)bytes[ 8] << 56) |
                         (long)bytes[ 9] << 48) |
                         (long)bytes[10] << 40) |
                         (long)bytes[11] << 32) |
                         (long)bytes[12] << 24) |
                         (long)bytes[13] << 16) |
                         (long)bytes[14] <<  8) |
                         (long)bytes[15]      );