A phone number, despite containing digits, isn't a number. It's not a count of anything, you won't be doing math with it. I definitely think you should store it as a char (or possibly varchar, see below about extensions). There can be unexpected ramifications of trying to store a non number in a numeric data type (for instance, what happens if — against common convention — a user enters a phone number that starts with 0?). Some data types could introduce rounding errors.
You can do client-side or server-side validation to make sure the format matches how you prefer to store them in the database (for instance, as 555-123-4567
or (555) 123-4567
or 5551234567
). Personally, I'd strip off all formatting such as dashes, spaces, and parenthesis for storage, then on display you can format it based on client setting, business purpose, or end-user preference.
If you have any chance of ever storing an extension (555-123-4567 x890
) or a phone number from any other country, you should probably use varchar with enough characters to include all possibilities. I just happen to use USA phone numbers in my examples, but if someone from the UK wants to put their international number in my database, I need to allow enough character space for their longer number plus country code.
There's some interesting discussion (and differing opinions) at mysql datatype for telephone number and address