2011-08-23 76 views
4

我经常在varchar(16)中储存信用卡号码。这有效,但每个数字需要17个字节。信用卡号码可以包含前导零吗?

存储并不是什么大不了的事,但我喜欢高效的存储需求和表搜索时间。

如果我可以使用decimal(16) unsigned,我可以将存储需求减少到7或8个字节,并且仍然保持可读性以及大部分兼容性。

这会去掉前导零。我能否依靠以非零数字开头的所有信用卡号码?

+0

信用卡是否总是16位数字?如果是的话,只需填充零即可。 – tenfour

+6

您是否存储了数十亿的信用卡号码以实现差异化,那么您还符合PCI DSS标准,但不知道此问题的答案?我只是说哇,你可以在varchar中做到这一点。加密算法肯定已经来临了! – Layke

+0

@tenfour:并非总是如此。有时他们是15位数字。 –

回答

5

Wikipedia,第一个数字的确可以0:

信用卡号码的第一个数字是主要行业标识符(MII),它代表发行信用卡的实体类别。不同的MII数字代表以下发行人类别:

  • 0 - ISO/TC 68等未来产业的任务

所以,不,我不认为你会想要使用省略前导零的存储。

3

他们可以。信用卡的第一个号码是主要行业标识符,它告诉你什么类型的实体发卡。所有十个数字都被使用,包括零。前六位整体形成发行者标识符,我不相信他们限制为0,如发现始于6011

Credit Card Numbering

8

信用卡号码(如电话号码和邮政编码)不是数字,也不应以数字数据类型存储。它们本质上是字符串数据。不打算在数学计算中使用的数字(除了用作id的自动分配整数)是字符串数据,它们将用作字符串数据,它们将作为字符串数据查询。

+0

如果我总是将“1”添加到卡号并以这种方式存储,该怎么办?我可以将它保留在足够大的整数类型中(例如C++中的uint64_t),然后如果我想比较两个卡号,它的运行成本就会低很多。 – Jezor

+0

即使信用卡号码应始终加密,比较它们是你永远不应该做的事情。将它们存储为某种字符数据类型并加密它们。 – HLGEM

+0

我的申请是用这种方式使用信用卡(未加密),它必须有效地搜索BIN号码的信用卡,所以它会进行大量的比较。我的问题是:什么解决方案会更有效率,而不一定更安全? (: – Jezor