Skip to content
Browse files

Backport of fix from rails/rails#5173

Rather than use the MySQL specific TINYTEXT, MEDIUMTEXT and LONGTEXT
datatypes, Active Record migrations use TEXT(n) where n is the limit
specified by the developer. Unfortunately how MySQL interprets n
depends on the column's encoding so any limit above 5592405 will be
interpreted as a LONGTEXT.

This commit fixes this by interpreting the limit within the adapter
and using the specific MySQL datatype as appropriate.
  • Loading branch information...
1 parent 14accdf commit 3105855abf5dbdf2fceef8c10c304fd5484229af @pixeltrix committed Aug 4, 2012
Showing with 20 additions and 9 deletions.
  1. +20 −9 lib/active_record/connection_adapters/mysql2_adapter.rb
View
29 lib/active_record/connection_adapters/mysql2_adapter.rb
@@ -494,15 +494,26 @@ def rename_column(table_name, column_name, new_column_name)
# Maps logical Rails types to MySQL-specific data types.
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
- return super unless type.to_s == 'integer'
-
- case limit
- when 1; 'tinyint'
- when 2; 'smallint'
- when 3; 'mediumint'
- when nil, 4, 11; 'int(11)' # compatibility with MySQL default
- when 5..8; 'bigint'
- else raise(ActiveRecordError, "No integer type has byte size #{limit}")
+ case type.to_s
+ when 'integer'
+ case limit
+ when 1; 'tinyint'
+ when 2; 'smallint'
+ when 3; 'mediumint'
+ when nil, 4, 11; 'int(11)' # compatibility with MySQL default
+ when 5..8; 'bigint'
+ else raise(ActiveRecordError, "No integer type has byte size #{limit}")
+ end
+ when 'text'
+ case limit
+ when 0..0xff; 'tinytext'
+ when nil, 0x100..0xffff; 'text'
+ when 0x10000..0xffffff; 'mediumtext'
+ when 0x1000000..0xffffffff; 'longtext'
+ else raise(ActiveRecordError, "No text type has character length #{limit}")
+ end
+ else
+ super
end
end

0 comments on commit 3105855

Please sign in to comment.
Something went wrong with that request. Please try again.