Преобразуйте большую строку в bigInteger и передайте ее подготовленному оператору

У меня эта строка говорит reference = '2039487894563827398440987'

Я пытаюсь преобразовать его в BigInteger, сделав что-то вроде

def reference = new BigInteger(reference)

а затем в подготовленном заявлении я устанавливаю его как

ps.setLong(reference);

База данных column(XYZ), в которой я отображаю это значение, имеет dataType BigInt(40). Но когда я выполняю оператор, он показывает исключение:

SQLSTATEEXCEPTION: Out of range value of column `XYZ` at row 1

Как справиться с такой ситуацией.

Изменить: тоже пробовал setBigDecimal(reference);.


person Sajjad    schedule 14.01.2015    source источник


Ответы (2)


Вы можете использовать setBigDecimal () вместо setLong ().

person sankar    schedule 14.01.2015
comment
Возможно, стоит отметить, что для использования setBigDecimal вам необходимо преобразовать BigInteger в BigDecimal, т.е. ps.setBigDecimal (новый BigDecimal (ссылка)); - person J Richard Snape; 14.01.2015
comment
@JRichardSnape да, я в этом убедился. - person Sajjad; 14.01.2015

Ваше число слишком велико для столбца MySQL BIGINT. Если вы прочитаете эти документы, то увидите, что тип данных BIGINT не может принимать такое большое число (максимум: ± 9223372036854775807 со знаком или 18446744073709551615 без знака). См. этот ответ для более полного просмотра документации - для разных типов серверов.

Если вы можете изменить тип в базе данных, вы можете подумать об изменении его на числовое поле, или сохранение числа в виде строки, или преобразование его в массив байтов и сохранение его как двоичного большого двоичного объекта.

ИЗМЕНИТЬ:

Для полноты - на случай, если кто-то не понимает, что означает 40 в BIGINT(40). Это почти ничего не значит. Это, конечно, не влияет на размер хранимого числа - это всегда 8 байтов (64 бита). Это подсказка базе данных о том, как отображать число, то есть отображать первые 40 цифр. Это может повлиять на заполнение нулями - например, если вы поместите значения 123456789 и 5 в столбец BIGINT(5), они могут отображаться как 123456789 и 00005. Проверьте документы, чтобы узнать о других доступных типах.

Обратите внимание, что самое длинное число, которое может хранить поле BigInt, составляет 20 цифр по основанию 10, поэтому 40 на самом деле почти ничего не означает.

person J Richard Snape    schedule 14.01.2015
comment
Да, я знаю об этом факте с BIGINT (40). Просто мне интересно, что нет другого способа вместо изменения dataType в БД - person Sajjad; 14.01.2015
comment
Думаю, что нет, в основном - потому что 2039487894563827398440987 ›18446744073709551615 - просто не влезет. Вам понадобится другой тип данных, если вы собираетесь хранить такие большие числа. - person J Richard Snape; 14.01.2015