it's pretty late, but I can add my 2 cents ....
I am in the telecommunications sector and have gained the best experience for storing phone numbers in structures (or objects) with variable-length character members, i.e.
struct TelephoneNumber ( InternationalPrefix VARCHAR; AreaCode VARCHAR; Subscriber VARCHAR; Extension VARCHAR;)
I never store access digits (zeros, double zeros, pluses, etc.), they do not belong to the phone number as such, but are part of what I can call the โdialing rulesโ
struct DialingRule ( International VARCHAR; National VARCHAR; Local VARCHAR;)
typical values โโfor DialingRule are "00", "0", "NULL" for a straight line, and "000", "00", "0" for a PBX requiring "0 to get a row"
to "display" the number, you can freely format objects, insert hyphens, brackets, or whatever you like
to create an accessible sequence, I determine the type (international, national or local) by comparing the corresponding elements of the FROM and TO number and adding the corresponding row from the set of dialing rules as a prefix.
All this may seem redundant, but I did not come up with international applications with high data integrity requirements and strong links to hardware. It eliminates the ambiguity and the need for hard coding lengths etc. when you want to manipulate numbers. It is also easy to fill in parts of the structure from the country / city search tables containing ISO country codes, IATA city codes and their corresponding prefixes.
Good luck MikeD