Often I have stored credit card numbers in varchar(16)
. That works, but it takes 17 bytes per number.
Storage is not that big a deal, but I like to be efficient, for both storage requirement, and table search time.
If I could use decimal(16) unsigned
, I could cut the storage requirement to 7 or 8 bytes, and still preserve readability as well as much of the compatibility.
This would strip leading zeros. Can I depend on all credit card numbers starting with a non-zero number?
Credit card numbers (like phone numbers and postal codes) are not numeric and should never be stored in a numeric datatype. They are inherently string data. Numbers that are not intended to be used in mathematical calculations (except autoassigned integers that are used as ids) are string data, they will be used as string data, they will be queried as string data.
According to Wikipedia, the first digit can indeed be 0:
The first digit of a credit card number is the Major Industry Identifier (MII), which represents the category of entity which issued the credit card. Different MII digits represent the following issuer categories:
- 0 – ISO/TC 68 and other future industry assignments
- etc.
So no, I don't think you'd want to use storage that omits leading zeros.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With