2009-06-16 47 views
28

Aplicación de rieles simples usando Postgres DB, obteniendo el error 'entero fuera de rango' cuando se intenta insertar 2176968859. Debería ser una solución fácil para las migraciones, pero no estoy seguro. En este momento tengo ...Entero fuera de rango en Postgres DB

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

Respuesta

1

Nota de la gama de valores permitidos para el tipo de número entero en http://www.postgresql.org/docs/8.3/interactive/datatype-numeric.html. Creo que vas a tener que usar un bigint, decimal o doble precisión.

+0

nice, any Idea ¿Cómo puedo obtener el número máximo para enteros programáticamente para que pueda establecerse en cero si alguien ingresa un número enorme? Uso la gema de pg en rieles. – ryan2johnson9

+0

@ ryan2johnson9 no fuera de uso, pero apuesto a que otra pregunta responderá eso; si no, pregunte uno nuevo – ysth

1

Los enteros de PostgreSQL están firmados, no hay ningún tipo de datos sin signo. Apuesto a que ese es su problema.

Si necesita valores más grandes, use bigint. Si bigint tampoco es suficiente, utilice numérico, pero utilice bigint en lugar de numérico a menos que necesite el tamaño más grande o decimales, ya que es mucho más rápido.

56

Aquí está el encantamiento mágico en su migración cuando se declara la columna:

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

El: Límite => 8 es la magia en este caso como postgres sólo no firmados enteros de 4 bytes cuando se acaba de decir número entero . Esto usa enteros con signo de 8 bytes.

+0

Prefiero recomendar cambiar/establecer un tipo de datos correcto en el campo de la tabla – StormByte

11

En Rails 4. En el archivo de migración, se podría definir la columna como:

t.column :foobar, :bigint 

Como se observa en las respuestas anteriores, limit: 8 También habrá lograr lo mismo

Cuestiones relacionadas