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?
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.
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.
They can. The first number of a credit card is it's Major Industry Identifier, which tells you what sort of entity issued the card. All ten digits are used, including zero. The first six digits overall form the issuer identifier, and I do not believe they restrict 0, as Discover begins with 6011.
Only ISO/TC 68 credit cards start with leading zeros (see also the Wikipedia entry for ISO/IEC 7812). So it seems that they'd be very rare, but possibly existing
来源:https://stackoverflow.com/questions/7164858/can-credit-card-numbers-contain-leading-zeros