21 fields is quite a lot. It's not a problem for MySQL, but I would prefer a separate table.
If it's likely there will be more preferences later, you might even consider a generic 3 column table for the preferences. The columns being something like:
UserID
PreferenceName
PreferenceValue
One row for each user preference. You might want to add a 4th column to be able to store lists of values. Effective use of this type of database model would require support for multiple result sets (so you can fetch the user info with all their preferences at once). You might want to check if your database access technology supports them.
Of course, with that approach, you would lose the ability to pick a data type for each preference. As an advantage, you could expand this model to make a Preference table, where you can define defaults for each preference.
# Fetch all preferences for a user, using defaults where no preferences are given
SELECT p.PreferenceName, COALESCE(up.PreferenceValue, p.DefaultValue)
FROM Preference p
LEFT OUTER JOIN UserPreference up ON up.PreferenceID = p.ID
WHERE up.UserID = ?
This would allow you to change defaults for your site easily.