2

我需要将 Java 的java.math.BigInteger数字存储在 SQL 中。我可以放心地假设这些数字将是正数,并且比在创建表时已知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
4

2 回答 2

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 的文档。

于 2014-11-02T17:46:50.397 回答
-1

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

示例:所需精度 = 4 输入 BigDecimal = new BigDecimal("12.3456")

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

因为它仍然是一个很大的 int 或类似的东西,所以无论底层 RDBMS 是什么,您都可以轻松比较这些数字。

于 2014-11-02T13:19:15.863 回答