web-dev-qa-db-de.com

Ganzzahl außerhalb des Bereichs in der PostgreSQL-Datenbank

Ich versuche, eine Zahl zu speichern, die die Länge einer Datei darstellt (4825733517). Die Spalte ist auf den Typ integer eingestellt. Ich habe keine Validierungen oder Einschränkungen festgelegt.

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

Soll ich für diesen Wert einen anderen Spaltentyp verwenden? (auf Schienen 4.2.4)

13
Ashbury

Bei Spalten vom Typ integer ist der :limit-Wert die maximale Spaltenlänge in Bytes ( documentation ).

Mit einer Länge von 4 Byte beträgt die größte vorzeichenbehaftete Ganzzahl 2.147.483.647 und ist damit wesentlich kleiner als Ihr Wert von 4.825.733.517. Sie können das Byte-Limit erhöhen, z. B. auf 8 Byte, um eine lange Ganzzahl zu sein (a bigint PostgreSQL-Typ ). Dadurch können Sie signierte Werte bis zu 9.223.372.036.854.775.807 speichern.

Sie können dies bei einer Migration mit etwas wie Rails generate migration change_integer_limit_in_your_table und dem folgenden Code erstellen:

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

Laut der PostgreSQL-Dokumentation eine ganze Zahl liegt zwischen -2147483648 und +2147483647 Ihre Zahl ist also zu groß für diesen Typ.

Aktualisieren Sie Ihre Spalte und verwenden Sie die Parameterbegrenzung, um anzugeben, dass Sie eine bigint haben möchten.

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

Sie sollten die Länge der Spalte in Ihrer Datenbank bei einer Migration ändern:

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

Damit können Sie größere Ganzzahlen speichern.

0
Caillou