Sql中的BIGINT与Java中的biginger之间的映射
我们面临着这样一个问题:当我们试图用sql中的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位整数,则需要使用
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中,
表示固定的64位整数。Java等价物是bigint
。请注意,T-SQL的long
和Java的bigint
都是有符号类型。它是由主机硬件本机处理的值的固有类型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] );