在RDBMS中存储java.math.BigInteger

时间:2014-11-02 12:58:18

标签: java sql rdbms biginteger rdbms-agnostic

我需要在SQL中存储Java的java.math.BigInteger个数字。我可以放心地假设在创建表时将会知道某些2^k的数字为正数且小于k。让我们说k = 256

如何将其存储在RDBMS中,以便我可以进行比较(<, >, =等)。

我目前正在转换为字节数组并将其存储为VARBINARY(k+1)

如果有帮助,我也可以将它们存储为VARCHAR。我需要一个独立于DBMS的方法来完成它。

EDIT1:跟随JBNizet的评论如下。我需要执行以下类型的SQL查询:

SELECT * FROM myTable WHERE bigInteger > 100
UPDATE myTable SET bigInteger = bigInteger + 10 WHERE bigInteger = 123

EDIT2:有可能将VARCHAR与词典排序进行比较。但是,增量会给出下面给出的奇怪行为(在SQLite上测试):

CREATE TABLE T(Id INTEGER PRIMARY KEY, Name VARCHAR, test VARCHAR);
INSERT INTO T VALUES(1,'Tom', '000030000000000000000000000000');
SELECT * FROM T;

 1|Tom|000030000000000000000000000000

UPDATE T SET test = test+1;  
SELECT * FROM T;

 1|Tom|3.0e+25

2 个答案:

答案 0 :(得分:3)

适当的类型是NUMERIC。但是,不同RDBMS之间的限制因此而异。例如,MySQL如果我没有弄错,则将NUMERIC限制为64位,MS SQL限制为38位,PostgreSQL限制为1000位。

您需要计算数字所需的十进制位数。例如,2 256 是1.15E77。这意味着您需要78位数字,因此您将声明您的字段NUMERIC(78)。这将在MySQL和MS SQL中失败,但在PostgreSQL上可以正常工作。

有些数据库系统对此类型使用不同的名称,例如DECIMAL(MySQL中的替代名称)或NUMBER(Oracle)。查看特定RDBMS的文档。

答案 1 :(得分:-1)

如果你必须保持恒定的精度,那么你可以执行整数运算和存储整数(如数学整数,而不是java int)。

实施例: 要求的精度= 4 输入BigDecimal = new BigDecimal(“12.3456”)

存储到DB的值:12.3456 * 10000 = 123456

因为它仍然是一个很大的int或smth,所以无论底层RDBMS是什么,你都可以很容易地比较这些数字。