2015-11-04 278 views
12

我試圖保存一個代表文件長度的數字(4825733517)。該列設置爲整型。我沒有任何驗證或限制設置。PostgreSQL數據庫中的整數超出範圍

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

我應該使用該值的其他列類型? (上軌4.2.4)

回答

22

對於integer類型的列中,:limit值是以字節爲單位的最大列長度(documentation)。

使用4字節長度,您可以存儲的最大有符號整數是2,147,483,647,比您的值4,825,733,517小。您可以增加字節限制,例如將8個字節設置爲長整數(一個bigint PostgreSQL type),這將允許您將有符號值存儲爲9,223,372,036,854,775,807。

您可以使用遷移做到這一點的東西,如rails generate migration change_integer_limit_in_your_table創建它,下面的代碼:

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

僅供參考,這是一個很好的答案,*幾乎*爲我工作。 **工作的**都是相同的語法,但是'change_column'而不是'update_column'。我正在使用Rails 4.2.6,所以也許不贊成使用「update_column」。 –

+0

你是絕對正確的 - 'update_column'只是不正確的,當第一次寫這個時,我可能會從其他答案中得到一個錯誤的提示。編輯帖子,謝謝指出 – p4sh4

0

您應該遷移更改列的長度在數據庫:

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

它將允許你存儲更大的整數。

+0

12個字節完全是大材小用,而且不符合PostgreSQL裏可用的數字類型。 – p4sh4

+0

我只是以12爲例。我們甚至不知道他需要保存的最大整數。 – Caillou

4

根據the PostgreSQL documentation,整數的範圍是從-2147483648到+2147483647。所以你的電話號碼對於這種類型很重要。

更新您的列並使用參數限制來指示您想擁有bigint

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