RailsのRuby)では、移行の次のコードにより、MySQLでタイプtinyint(4)
の列が作成されます。
_create_table :great_table do |t|
t.integer :step_position, :limit => 1 #tinyint
end
_
タイプtinyint(2)
またはtinyint(3)
の列を作成するにはどうすればよいですか?
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
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
そもそもMySQLにはtinyint(4)
のようなものはありません。 tinyint
は1バイトの符号付き整数です。 docs ですべての整数型を確認できます。 Rails ソースコード でもtinyint(1)
のようなものが表示される場合がありますが、tinyint
がすでに示唆しているように、これはトートロジーだと思います1バイトのストレージ。
移行でTINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
を宣言するRails方法は、 ソースコード に見られるように、適切なバイトサイズでlimit:
を使用することです。 。
ただし、上記のリンクからわかるように、Railsは、デフォルトで1バイトの整数をブール値として扱うことに注意してください。
Railsマイグレーションでは、列タイプとして:tinyint
を使用し、前に記述したようにlimit: 2
またはlimit: 3
を書き込むことができます。
あなたの例を使用して:
create_table :great_table do |t|
t.tinyint :step_position, :limit => 1
end
動作するはずです。