Могут ли номера кредитных карт содержать начальные нули?
Часто я храню номера кредитных карт в varchar(16)
, Это работает, но это занимает 17 байтов на число.
Хранение не так уж и важно, но мне нравится быть эффективным, как по требованию к памяти, так и по времени поиска в таблице.
Если бы я мог использовать decimal(16) unsigned
Я мог бы сократить требования к хранилищу до 7 или 8 байтов, и при этом сохранить читабельность, а также большую часть совместимости.
Это лишило бы ведущих нулей. Могу ли я зависеть от всех номеров кредитных карт, начиная с ненулевого номера?
4 ответа
Согласно Википедии, первая цифра действительно может быть 0:
Первая цифра номера кредитной карты - это основной отраслевой идентификатор (MII), который представляет категорию организации, выпустившей кредитную карту. Различные цифры MII представляют следующие категории эмитентов:
- 0 - ISO/TC 68 и другие будущие отраслевые назначения
- и т.п.
Так что нет, я не думаю, что вы захотите использовать хранилище, в котором пропущены начальные нули.
Номера кредитных карт (например, номера телефонов и почтовые индексы) не являются числовыми и никогда не должны храниться в числовом типе данных. Они по сути являются строковыми данными. Числа, которые не предназначены для использования в математических вычислениях (кроме автоматически назначаемых целых чисел, которые используются в качестве идентификаторов), являются строковыми данными, они будут использоваться как строковые данные, они будут запрашиваться как строковые данные.
Только кредитные карты ISO/TC 68 начинаются с лидирующих нулей (см. Также запись в Википедии для ISO / IEC 7812). Так что кажется, что они были бы очень редкими, но, возможно, существующими
Они могут. Первый номер кредитной карты - это "Основной отраслевой идентификатор", который указывает, какой тип организации выпустил карту. Используются все десять цифр, включая ноль. Первые шесть цифр в целом образуют идентификатор эмитента, и я не верю, что они ограничивают 0, так как обнаружение начинается с 6011.