Хранение java.math.BigInteger в РСУБД

Мне нужно хранить Java java.math.BigInteger числа в SQL. Я могу с уверенностью предположить, что цифры будут положительными и меньше, чем 2^k для некоторых k это будет известно во время создания таблицы. Допустим k = 256,

Как мне сохранить его в РСУБД, чтобы он позволял мне сравнивать (<, >, = так далее).

В настоящее время я преобразовываю в байтовый массив и сохраняю их как VARBINARY(k+1),

Я также могу хранить их как VARCHAR если это поможет Мне нужен независимый от СУБД способ сделать это.

РЕДАКТИРОВАТЬ1: после комментария 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 ответа

Соответствующий тип является ЦИФРОВЫМ. Тем не менее, ограничения на этот тип отличаются между различными RDBMS. MySQL, например, ограничивает NUMERIC до 64 цифр, если я не ошибаюсь, MS SQL ограничивается до 38 цифр, а PostgreSQL - до 1000 цифр.

Вам нужно посчитать, сколько десятичных цифр вам понадобится для числа. Например, 2256 - это 1.15E77. Это означает, что вам нужно 78 цифр, поэтому вы объявите свое поле NUMERIC(78). Это не удастся в MySQL и MS SQL, но будет хорошо работать на PostgreSQL.

Существуют системы баз данных, которые используют разные имена для этого типа, такие как DECIMAL (альтернативное имя в MySQL) или NUMBER (Oracle). Проверьте документацию вашей конкретной СУБД.

Если у вас есть постоянная точность, которую вы должны сохранить, то вы можете просто выполнить целочисленную арифметику и сохранить целые числа (как в математическом целом числе, а не в java int).

Пример: Требуемая точность = 4 Ввод BigDecimal = new BigDecimal("12.3456")

Значение, сохраненное в БД: 12.3456 * 10000 = 123456

Так как это все равно будет большое значение типа int или smth, вы можете легко сравнивать такие числа независимо от того, что лежит в основе СУБД.

Другие вопросы по тегам