Хранение 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, вы можете легко сравнивать такие числа независимо от того, что лежит в основе СУБД.