For the most efficient use of storage, try to use the most precise
type in all cases. For example, if an integer column is used for
values in the range from 1 to
99999, MEDIUMINT UNSIGNED is
the best type. Of the types that represent all the required
values, it uses the least amount of storage.
For earlier MySQL versions, accurate representation of monetary
values was a common problem. In these MySQL versions, you should
also use the DECIMAL type. In this case the
value is stored as a string, so no loss of accuracy should occur
on storage. Calculations on these DECIMAL
values are however done using double-precision operations. If
accuracy is not too important or if speed is important, the
DOUBLE type may also be good enough.
For high precision, you can always convert to a fixed-point type
stored in a BIGINT. This allows you to do all
calculations with 64-bit integers and then convert results back to
floating-point values only when necessary.

User Comments
The above says far to less, what I wish to see hear in the near future maybe some suggestions as to specific type of data, eg. what to choose for email, for usernames, passwords, or even images. Because for most people who are new to this can have difficulties choosing the type of data to store as, maybe giving a few more example could be a better idea.
Ted
This is something that I'm surprised that this article does not link to and something that I didn't know until I attended a MySQL Seminar.
The PROCEDURE ANALYSE Clause is extremely useful for determining column types for tables that are in use. It's a great way to use the MySQL Optimizer to tell you the behavior of a table and how best to use it based off of data that is already contained in it.
http://dev.mysql.com/doc/refman/5.0/en/procedure-analyse.html
Add your own comment.