Mysql integer data types

As I could not get a definite answer at lighthouse (#432 mysql adapter with mediumt support - Ruby on Rails - rails), whether my assumption about rails' incorrect handling of mysql integer data types was right or not, I now turn to this mailing list.

About a month ago I wrote a patch posted here: http://rails.lighthouseapp.com/projects/8994/tickets/432-mysql-adapter-with-mediumt-support

A couple of weeks later Jeremy Kemper commited this: http://github.com/rails/rails/commit/4498aad4acda002b8f213f13c4acd52cba04d224

However, I'm personally not sure he has done everything correct.

Example (taken from Jeremy's commit): when 1; 'tinyint' when 2; 'smallint' when 3; 'mediumint'

For instance, doesn't this mean that rails will choose mediumint as data type for storing integers with a length of 3? That should be smallint! Smallint holds (if signed) -32768 to 32767 so it would easy hold an integer with length of 3 and even 4. Using mediumint here just wastes disk space and increase mysql memory consumption without any reason.

As I understand rails and mysql data types, it should rather be something like (as I've written in my patch):

when 0..2; 'tinyint' when 2..4; 'smallint' when 5..6; 'mediumint' when 7..9; 'int' when 9..20; 'bigint'

Or am I missing something here? If I am - sorry for my newbie-ism, this is my first time trying to contribute to open source.

- Rasmus

As I could not get a definite answer at lighthouse (#432 mysql adapter with mediumt support - Ruby on Rails - rails), whether my assumption about rails' incorrect handling of mysql integer data types was right or not, I now turn to this mailing list.

About a month ago I wrote a patch posted here: #432 mysql adapter with mediumt support - Ruby on Rails - rails

A couple of weeks later Jeremy Kemper commited this: MySQL: treat integer with :limit => 11 as a display width, not byte s… · rails/rails@4498aad · GitHub

However, I'm personally not sure he has done everything correct.

Example (taken from Jeremy's commit): when 1; 'tinyint' when 2; 'smallint' when 3; 'mediumint'

These are byte lengths, not number of digits in decimal. So 3 has to be -8388608 to 8388607, which is exactly what medium int is: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

Indeed Rails used to treat those limits as the number of decimal places for the mysql adapter, but this was changed so all adapters would use the same definition of integer :limit.

Ofcourse means that whatever migrations you run on the new code may need to be changed if they specify limits for integer (though if they do you will likely get a longer integer, not shorter, so you may not even notice that anything is wrong).

(btw. for :decimal scale and precision still refer to the number of decimal places, this change only affects integer :limit interpretation)

As I understand rails and mysql data types, it should rather be something like (as I've written in my patch):

when 0..2; 'tinyint' when 2..4; 'smallint' when 5..6; 'mediumint' when 7..9; 'int' when 9..20; 'bigint'

This is exactly what the code used to be like.

Regards,

Thank you for that clarification.