web-dev-qa-db-fra.com

Entier hors limites dans la base de données PostgreSQL

J'essaie d'enregistrer un nombre représentant la longueur d'un fichier (4825733517). La colonne est définie pour taper un entier. Je n'ai aucune validation ou restriction définie.

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

Devrais-je utiliser un autre type de colonne pour cette valeur? (sur Rails 4.2.4)

13
Ashbury

Pour les colonnes de type integer, la valeur :limit est la longueur maximale de la colonne en octets ( documentation ). 

Avec une longueur de 4 octets, le plus grand nombre entier signé que vous pouvez stocker est 2 147 483 647, beaucoup plus petit que votre valeur de 4 825 733 517. Vous pouvez augmenter la limite d'octets, par exemple à 8 octets pour qu'elle soit un entier long (un bigint de type PostgreSQL ), cela vous permettra de stocker des valeurs signées allant jusqu'à 9 223 372 036 857 757. 

Vous pouvez faire cela avec une migration, créez-la avec quelque chose comme Rails generate migration change_integer_limit_in_your_table et le code suivant:

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

Selon la documentation de PostgreSQL , un entier va de -2147483648 à +2147483647. Donc, votre nombre est trop grand pour ce type.

Mettez à jour votre colonne et utilisez le paramètre limit pour indiquer que vous souhaitez avoir une bigint.

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

Vous devriez changer la longueur de la colonne dans votre base de données avec une migration:

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

Cela vous permettra de stocker de plus grands nombres entiers.

0
Caillou