在Ruby on Rails中,迁移中的以下代码在MySQL中创建了一个类型为tinyint(4)
的列:
create_table :great_table do |t|
t.integer :step_position, :limit => 1 #tinyint
end
如何创建tinyint(2)
或tinyint(3)
类型的列?
答案 0 :(得分:15)
对于tinyint(2)
create_table :great_table do |t|
t.integer :step_position, :limit => 2
end
对于tinyint(3)
create_table :great_table do |t|
t.integer :step_position, :limit => 3
end
答案 1 :(得分:3)
根据我在gem的源代码中可以看到的内容,你不能:
# File activerecord/lib/active_record/connection_adapters/mysql_adapter.rb, line 540
540: def type_to_sql(type, limit = nil, precision = nil, scale = nil)
541: return super unless type.to_s == 'integer'
542:
543: case limit
544: when 1; 'tinyint'
545: when 2; 'smallint'
546: when 3; 'mediumint'
547: when nil, 4, 11; 'int(11)' # compatibility with MySQL default
548: when 5..8; 'bigint'
549: else raise(ActiveRecordError, "No integer type has byte size #{limit}")
550: end
551: end
答案 2 :(得分:2)
首先,MySQL中没有tinyint(4)
这样的东西。 tinyint
是一个单字节有符号整数。您可以检查docs中的所有整数类型。你甚至可以在Rails source code中看到类似tinyint(1)
的内容,但我认为这是一个重言式,因为tinyint
已经暗示了一个字节存储。
在迁移中声明TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
的Rails方法是使用limit:
并使用适当的字节大小,如source code中所示。
请注意,默认情况下,Rails会将一个字节的整数视为布尔值,如上面的链接所示。
答案 3 :(得分:1)
您可以在rails迁移中使用:tinyint
作为列类型,并按照之前的说明编写limit: 2
或limit: 3
。
使用您的示例:
create_table :great_table do |t|
t.tinyint :step_position, :limit => 1
end
应该有用。