Целочисленность вне диапазона в базе данных PostgreSQL

Я пытаюсь сохранить число, представляющее длину файла (4825733517). В столбце задано значение integer. У меня нет никаких утверждений или ограничений.

RangeError: 4825733517 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4

Должен ли я использовать какой-либо другой тип столбца для этого значения? (на рельсах 4.2.4)

Ответ 1

Для столбцов типа integer значение :limit - это максимальная длина столбца в байтах (документация).

С длиной в 4 байта наибольшее целое число со знаком, которое вы можете сохранить, составляет 2,147,483,647, что меньше, чем ваше значение 4,825,733,517. Вы можете увеличить ограничение байта, например до 8 байтов, чтобы быть длинным целым числом (a bigint PostgreSQL type), это позволит вам хранить подписанные до 9,223,372,036,854,775,807.

Вы можете сделать это с помощью миграции, создав его с чем-то вроде rails generate migration change_integer_limit_in_your_table и следующим кодом:

class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
  def change
    change_column :your_table, :your_column, :integer, limit: 8
  end 
end

Ответ 2

Согласно документации PostgreSQL целое число имеет диапазон от -2147483648 до +2147483647. Таким образом, ваш номер будет большим для этого типа.

Обновите столбец и используйте ограничение параметра, чтобы указать, что вы хотите иметь bigint.

change_column :table, :column, :integer, limit: 8

Ответ 3

Вы должны изменить длину столбца в своей базе данных с помощью миграции:

update_column :my_table, :my_column, :integer, limit: 12

Это позволит вам хранить большие целые числа.