我需要在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
答案 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是什么,你都可以很容易地比较这些数字。