2009-06-16 18 views
28

App per rotaie semplice che utilizza DB Postgres, ottenendo errore "intero fuori intervallo" quando si tenta di inserire 2176968859. Dovrebbe essere una soluzione semplice alle migrazioni, ma non sono sicuro. In questo momento ho ...Numero intero fuori campo su DB Postgres

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

risposta

1

Nota l'intervallo di valori consentiti per il tipo intero in http://www.postgresql.org/docs/8.3/interactive/datatype-numeric.html. Penso che dovrai usare un bigint, decimale o doppia precisione.

+0

nice, any Idea come posso ottenere il numero massimo per intero a livello di codice in modo da poter impostare a zero se qualcuno inserisce un numero enorme? Io uso la gemma pg in binari. – ryan2johnson9

+0

@ ryan2johnson9 non in modo casuale, ma scommetto che un'altra domanda risponderà a questo; in caso contrario, chiedi a una nuova – ysth

1

Gli interi PostgreSQL sono firmati, non esiste un tipo di dati non firmato. Scommetto che questo è il tuo problema.

Se sono necessari valori maggiori, utilizzare bigint. Se bigint non è sufficiente, utilizza il valore numerico, ma utilizza il bigint anziché il numerico, a meno che non sia necessario il formato più grande o decimali, poiché è molto più veloce.

56

Ecco l'incantesimo magico nella migrazione quando si dichiara la colonna:

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

L': limite => 8 è la magia in questo caso come postgres solo non firmati integer a 4 byte quando hai appena detto intero . Questo utilizza numeri interi con segno a 8 byte.

+0

Preferisco raccomandare di cambiare/impostare un tipo di dati corretto nel campo della tabella – StormByte

11

In Rails 4. Nel file di migrazione, è possibile definire la colonna come:

t.column :foobar, :bigint 

Come osservato nelle risposte precedenti, limit: 8 sarà anche ottenere la stessa cosa