2009-06-16 5 views
28

Application de rails simples utilisant DB Postgres, obtenant l'erreur 'entier hors de portée' en essayant d'insérer 2176968859. Devrait être une solution facile aux migrations, mais je ne suis pas sûr. En ce moment j'ai ...Entier hors de portée sur Postgres DB

create_table :targets do |t| 
    t.integer :tid 
    ... 
end 

Répondre

1

Remarque la plage de valeurs autorisées pour le type entier dans http://www.postgresql.org/docs/8.3/interactive/datatype-numeric.html. Je pense que vous allez devoir utiliser un bigint, un décimal ou une double précision.

+0

nice, any Idea comment je peux obtenir le nombre maximum pour l'entier par programme afin que je puisse mettre à zéro si quelqu'un entre un nombre énorme? J'utilise le pg gem dans les rails. – ryan2johnson9

+0

@ ryan2johnson9 pas désinvolte, mais je parie qu'une autre question répondra à cette question; si ce n'est pas le cas, demandez-en un nouveau – ysth

1

Les entiers PostgreSQL sont signés, il n'y a pas de type de données non signé - je parie que c'est votre problème.

Si vous avez besoin de valeurs plus grandes, utilisez bigint. Si bigint ne suffit pas, utilisez numeric - mais utilisez plutôt bigint plutôt que numeric à moins que vous ayez besoin de la plus grande taille ou des décimales, car c'est beaucoup plus rapide.

56

Voici le incantatoire magique dans votre migration lorsque vous déclarez la colonne:

create_table :example do |t| 
    t.integer :field, :limit => 8 
end 

La: limite => 8 est la magie dans ce cas comme postgres seulement ne entiers signés 4 octets lorsque vous dites simplement entier . Cela utilise des entiers signés de 8 octets.

+0

Je recommanderais plutôt de changer/définir un type de données correct dans le champ de la table – StormByte

11

Dans Rails 4. Dans votre fichier de migration, vous pouvez définir la colonne comme:

t.column :foobar, :bigint 

Comme il est indiqué dans les réponses précédentes, limit: 8 donneront également lieu à la même chose