我正在使用Rails 4.2.5应用程序,该应用程序允许使用Paperclip上传视频。它工作正常,除了非常大的文件。使用超过3GB的视频我收到以下错误:
RangeError (3283091012 is out of range for ActiveRecord::Type::Integer with limit 4)
现在我可以告诉3283091012
是文件的大小所以我认为当MySQL试图为回形针创建的file_size
字段保存该值时会发生这种情况,我可以通过增加来修复它数据库中的限制甚至更好地使用迁移文件,但我想我之前检查了表结构,我对以下内容感到惊讶:
mysql> describe formats;
+-------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| video_id | int(11) | YES | MUL | NULL | |
| name | varchar(255) | YES | | NULL | |
| quality | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| file_file_name | varchar(255) | YES | | NULL | |
| file_content_type | varchar(255) | YES | | NULL | |
| file_file_size | int(11) | YES | | NULL | |
| file_updated_at | datetime | YES | | NULL | |
| trailer | tinyint(1) | YES | | 0 | |
+-------------------+--------------+------+-----+---------+----------------+
正如您所看到的,file_file_size
是int(11)
而不是错误声明的4。
知道是什么导致了这个吗?
注意:我没有对模型进行任何花哨的验证(仅强制存在一些属性),控制器操作是常规的创建操作。
答案 0 :(得分:1)
根据MYSQL文档,整数的范围是-2147483648到+2147483647。所以这个类型的数量很大。
更新您的列并使用参数限制来表示您想要一个bigint。
class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
def change
update_column :your_table, :your_column, :integer, limit: 8
end
end
答案 1 :(得分:1)
int(11)中的11和int(20)中的20是这些列的显示宽度。它们不反映用于存储整数的位数;相反,它们可以用于零填充。
11是INT的默认值,因为带符号的4字节整数的最大宽度为-2147483648。类似地,20是BIGINT的默认值,因为8字节整数的最大宽度是-9223372036854775808。
事实上,在更新列之后,我希望file_file_size是bigint(20)。
这里有一个很好的解释。 https://blogs.oracle.com/jsmyth/what-does-the-11-mean-in-int11
答案 2 :(得分:0)
作为Srv的回答是在运行迁移时给出了undefined method 'update_column'
错误,但这有效:
class ChangeIntegerLimitInFormats < ActiveRecord::Migration
def self.up
change_table :formats do |t|
t.change :file_file_size, :integer, limit: 8
end
end
def self.down
change_table :formats do |t|
t.change :file_file_size, :integer, limit: 4
end
end
end
运行迁移后检查表结构会显示列file_file_size
现在是Int(20)
而不是之前的Int(11)
,不确定4如何转换为11和8虽然翻译为20,但这是一个混乱的起点,如果有人有信息,请添加评论。