Thanks! I will be looking into this more. I'm aware of the 9digit zipcodes. I'll look into the USPS API. Also, I'll address the other comment below. That might answer some questions.
This is fairly useful if you are trying to get mailing addresses, though you have to be careful about rural route areas and other crap. There are also plenty areas where people are required to use mailing addresses that do not match what the zipcode says.
This is completely non-useful if you are trying to get residence addresses.
Among other things:
1. There are plenty of places in the US where the zipcode serves an area many miles (IE 20+) away from the "city" associated with the zip code.
2. Postal boundaries do not match a lot of boundaries, and aren't updated as often.
There are times when, for example, zip codes for towns in maryland were served from DC. So if you did reverse lookup on zip code, it would give you the wrong state and city.
This still happens near boundaries of states.
3. ZIP+4 does not solve these issues with enough accuracy (It's only about 95% accurate). ZIP+9 is still wrong about the city in plenty of cases.
My only problem with 9 digit zip codes is that I have no idea what mine is. I know the first 5 but not the last 4. If you have multiple addresses or move around a lot its not something you are quick to remember, at least for me. I wonder how many people actually know their 9 digit zip.
Also, zip codes may change service areas each year, and so would be necessary to use 3rd party zipcode database and do a spatial join to add city, county, state attributes to each zip code. then import this table to mysql as lookup table.