2011-08-23 5 views
4

자주 varchar(16)에 신용 카드 번호를 저장했습니다. 작동하지만 숫자 당 17 바이트가 필요합니다.신용 카드 번호에 앞에 오는 0이 포함될 수 있습니까?

스토리지는 그다지 큰 거래는 아니지만 스토리지 요구 사항과 테이블 검색 시간 모두에있어 효율적이라고 생각합니다.

decimal(16) unsigned을 사용할 수 있다면 저장소 요구 사항을 7 또는 8 바이트로 줄일 수 있으며 호환성의 상당 부분과 가독성을 유지할 수 있습니다.

이렇게하면 앞에 오는 0이 제거됩니다. 0이 아닌 번호로 시작하는 모든 신용 카드 번호에 의존 할 수 있습니까?

+0

신용 카드는 항상 16 자리입니까? 그렇다면 패드 왼쪽에 0으로 남겨 둡니다. – tenfour

+6

차이를 만들기 위해 수십억 개의 신용 카드 번호를 저장하고 있습니까? 그렇다면이 질문에 대한 답변을 아직 모르는 상태에서 PCI DSS를 준수합니까? 나는 와우, 당신은 varchar에서만 이것을 할 수 있다고 말하고 싶습니다. 암호화 알고리즘은 먼 길을 왔을 것입니다! – Layke

+0

@tenfour : 항상 그런 것은 아닙니다. 때로는 15 자리 숫자입니다. –

답변

5

시작으로 그들은, 0을 제한 믿지 않는, 첫 번째 숫자는 실제로 0이 될 수 있습니다

신용 카드 번호의 첫 번째 숫자는 주요 산업 식별자 (MII)이며 신용 카드를 발급 한 엔티티의 카테고리를 나타냅니다. 등

ISO/TC 68 및 기타 미래 산업 할당

  • 그래서 아니, 난 당신이 생각할 것 없어 -

    • 0 : 다른 MII의 숫자는 다음 발행 범주를 나타냅니다 앞에 오는 0이 생략 된 저장소를 사용하려고합니다.

  • 3

    ISO/TC 68 credit cards 만 앞에 0이 붙습니다 (위키피디아 항목 ISO/IEC 7812 참조). 그래서 그들은 매우 드문 것으로 보이지만 이미 존재하는 것 같습니다.

    3

    수 있습니다. 신용 카드의 첫 번째 번호는 주요 산업 식별자로, 어떤 종류의 카드 발급 기관인지 알려줍니다. 0을 포함하여 10 자리 숫자가 모두 사용됩니다. 처음 여섯 자리 숫자는 전체 발행자 식별자를 형성하고, 내가 발견이 Wikipedia에 따르면 6011

    Credit Card Numbering

    8

    신용 카드 번호 (전화 번호 및 우편 번호와 같은)는 숫자가 아니며 숫자 데이터 유형에 저장하면 안됩니다. 본질적으로 문자열 데이터입니다. 수학 계산에 사용되지 않는 숫자 (ID로 사용되는 자동 할당 된 정수 제외)는 문자열 데이터이며, 문자열 데이터로 사용되며 문자열 데이터로 쿼리됩니다.

    +0

    카드 번호에 항상 "1"을 더하고 그런 식으로 저장하면 어떨까요? 나는 정수 타입을 충분히 (예를 들어, uint64_t를 C++과 같이) 유지할 수 있고 두 개의 카드 번호를 비교하고 싶다면 훨씬 덜 비싸다. – Jezor

    +0

    신용 카드 번호는 항상 암호화되어 있어야하며, 결코 비교해서는 안됩니다. 그들을 일종의 문자 데이터 유형으로 저장하고 암호화하십시오. – HLGEM

    +0

    내 응용 프로그램은 암호화되지 않은 방식으로 신용 카드를 사용하기 때문에 신용 카드의 BIN 번호를 효율적으로 검색해야하므로 많은 비교가 수행됩니다. 내 질문입니다 : 어떤 솔루션이 더 효율적이고, 반드시 더 안전하지 않을까요? (: – Jezor