2015-01-14 2 views
1

У меня есть эта строка сказать reference = «2039487894563827398440987»Преобразовать большую строку BigInteger и передать его в подготовленное заявление

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

def reference = new BigInteger(reference) 

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

ps.setLong(reference); 

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

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

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

Редактировать: Пробовал setBigDecimal(reference);.

ответ

1

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

+0

Да, пробовал это тоже. Избавьтесь от моего комментария – Sajjad

+0

Не стоит забывать, что для использования setBigDecimal вам нужно преобразовать BigInteger в BigDecimal i.e. ps.setBigDecimal (новый BigDecimal (ссылка)); –

+0

@JRichardSnape да, я убедился в этом. – Sajjad

1

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

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

EDIT:

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

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

+0

Да, я знаю об этом с BIGINT (40). Его просто интересно, что нет другого способа вместо изменения dataType в DB – Sajjad

+1

Я думаю, что нет, в основном - потому что 2039487894563827398440987> 18446744073709551615 - он просто не подойдет. Вам нужен другой тип данных, если вы собираетесь хранить цифры, большие. –