문제

국가번호, 내선번호 등 전화번호를 양식에 입력하고 싶습니다.

create table if not exists employee(    `   
      country_code_tel   int(11),
      tel_number         int(10),
      extension          int(10),
      mobile             bigint(20)
);

tel_number가 15비트보다 크면 어떤 데이터 유형을 사용할 수 있습니까? Bigint(20)?

create table address(
      address           varchar(255),  
      city              varchar(255),
      country           varchar(255),
      post_code         int(11)
);

예를 들어 캐나다 국가 코드가 있는 경우 +2 또는 002를 사용할 수 있습니다.처리에는 어느 것이 더 낫습니까?

조언해 주셔서 감사합니다.

도움이 되었습니까?

해결책

글쎄, 개인적으로 나는 전화 번호 나 관련 정보를 저장하기 위해 숫자 데이터 유형을 사용하지 않습니다.

001234567이라는 숫자를 어떻게 저장합니까? 그것은 1234567로 끝나고 주요 0을 잃게됩니다.

물론 당신은 항상 그것을 좌회전 할 수 있지만, 그 숫자가 얼마나 많은 숫자인지 정확히 알 수 있습니다.

이것은 전체 게시물에 응답하지 않습니다.
내 2 센트

다른 팁

실제로 전화 번호에는 Varchar를 사용할 수 있습니다. 숫자에서 산술을 수행하지 않기 때문에 int가 필요하지 않습니다.

전화 번호의 두 필드로 보관하십시오 - "번호"와 "마스크" TinyText 유형 255 개 이상의 항목이 필요하지 않습니다.

파일을 저장하기 전에 전화 번호를 구문 분석하여 사용 된 서식을 가져오고 마스크를 생성 한 다음 숫자 숫자를 저장합니다.

입력: (0123) 456 7890
숫자: 01234567890
마스크: (nnnn)_nnn_nnnn

이론적으로 이것은 사용자가 입력 한 방법을 걱정하지 않고 특정 영역 코드로 시작하는 모든 전화 번호를 얻는 것과 같은 숫자 필드에서 비교 검색을 수행 할 수 있습니다.

나는 보통 전화 번호를 E164 형식으로 큰 사람으로 저장합니다.

E164는 0으로 시작하지 않으며 처음 몇 자리는 국가 코드입니다.

+441234567890
+44 (0)1234 567890
01234 567890

441234567890.

전화 번호에는 바르 차를 사용합니다. 그렇게하면 +와 ()도 저장할 수 있으며, 때로는 TEL 번호로 볼 수 있습니다 (자신이 언급 한 것처럼). 정수의 모든 비트를 사용하는 것에 대해 걱정할 필요가 없습니다.

정수를 사용하는 것이 좋은 생각인지 잘 모르겠습니다.일부 숫자에는 처리할 수 있는 특수 문자(예: 확장자의 일부인 #)가 포함될 수 있습니다.따라서 대신 varchar를 사용하는 것이 좋습니다.

1 MIL 레코드를 저장하고 고성능이 문제가되지 않는 경우 Varchar (20)/char (20)에 문제가되지 않으면 100 MILION Global Business Phones 또는 Personal 전화를 저장하기 위해서는 INT가 가장 좋습니다. 이유 : 더 작은 키 -> 더 높은 읽기/쓰기 속도, 형식도 중복을 허용 할 수 있습니다.

1 char (20) = 20 바이트 대 8 바이트의 전화 1 전화 bigint (또는 10 대 4 바이트 int 로컬 휴대 전화의 경우 최대 9 자리)의 경우 항목이 적은 인덱스 블록을 입력 할 수 있습니다 => 더 많은 블록 => 더 많은 검색, 참조하십시오. 이것 자세한 정보 (MySQL 용으로 writen이지만 다른 관계형 데이터베이스에 대해서는 사실이어야 함).

다음은 전화 테이블의 예입니다.

CREATE TABLE `phoneNrs` (   
    `internationalTelNr` bigint(20) unsigned NOT NULL COMMENT 'full number, no leading 00 or +, up to 19 digits, E164 format',
    `format` varchar(40) NOT NULL COMMENT 'ex: (+NN) NNN NNN NNN, optional',
    PRIMARY KEY (`internationalTelNr`)
    )
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin

또는 삽입하기 전에 처리/분할 (2+2+4+1 = 9 바이트)

CREATE TABLE `phoneNrs` (   
    `countryPrefix` SMALLINT unsigned NOT NULL COMMENT 'countryCode with no leading 00 or +, up to 4 digits',
    `countyPrefix` SMALLINT unsigned NOT NULL COMMENT 'countyCode with no leading 0, could be missing for short number format, up to 4 digits',
    `localTelNr` int unsigned NOT NULL COMMENT 'local number, up to 9 digits',
    `localLeadingZeros` tinyint unsigned NOT NULL COMMENT 'used to reconstruct leading 0, IF(localLeadingZeros>0;LPAD(localTelNr,localLeadingZeros+LENGTH(localTelNr),'0');localTelNr)',
    PRIMARY KEY (`countryPrefix`,`countyPrefix`,`localLeadingZeros`,`localTelNr`)  -- ordered for fast inserts
) 
DEFAULT CHARSET=ascii
DEFAULT COLLATE=ascii_bin
;

또한 "전화 번호는 숫자가 아닙니다". 제 생각에는 전화 번호 유형과 관련이 있습니다. 우리가 내부 휴대 전화 번호부에 대해 이야기하고 있다면, 사용자가 저장할 수 있으므로 문자열이 괜찮습니다. GSM 해시 코드. 저장하는 경우 E164 전화, bigint가 최선의 선택입니다.

정규화를 고려하십시오 E.164 체재. 완전한 국제 지원을 위해서는 15 자리의 바르 차가 필요합니다.

보다 Twilio의 추천 전화 번호의 현지화에 대한 자세한 내용.

int (10)는 10 자리 숫자를 의미하지 않으며 디스플레이 너비가 10 자리 인 정수를 의미합니다. MySQL의 int의 최대 값은 2147483647 (또는 서명되지 않은 경우 4294967295)입니다.

int 대신 Bigint를 사용하여 숫자로 저장할 수 있습니다. Bigint를 사용하면 Varchar (10)를 통해 행당 3 바이트를 절약 할 수 있습니다.

"Country + Area + Number"를 저장하려면. Varchar (20)를 사용해 볼 수 있습니다.이를 통해 필요한 경우 국제 전화 번호를 올바르게 저장할 수 있습니다.

Varchar 또는 텍스트는 휴대폰 번호를 저장하는 데 가장 적합한 데이터 유형이어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top