전화 번호 데이터 유형 : VARCHAR, INT 또는 BIGINT?


12

그래서 이것은 올해의 더미 질문이 될 것입니다. 다음 테이블 정의를 살펴보십시오.

여기에 이미지 설명을 입력하십시오

지금 from_number은 열 을 VARCHAR(45)보지만 전화 번호를 보유합니다. 전 세계에 전화가 몇 개의 전화 번호를 가질 수 있는지 모르기 때문에 거의 모든 번호를 다루려고합니다. 내가 생각 있도록 가능한 한 데이터베이스 무결성을 유지하려면 VARCHAR유지를위한 올바른 유형의 이러한 종류의 정보 아닙니다 - 어쩌면 내가 잘못, 당신이 말해 - 나는에 변화를 생각하고, 그래서 INT심지어 BIGINT.

Workbench에서 열을 정의 할 때 ()모든 경우가 아니라 이전에 언급 한 괄호 사이의 숫자를 지정 해야합니다. 따라서이 작업을 수행하면 다음 BIGINT()오류가 발생합니다.

여기에 이미지 설명을 입력하십시오

이 MySQL 유형에 대해 조금 읽어 보도록 안내 하십시오 . 기본적으로 정보는 다음과 같습니다.

큰 정수 ... 부호없는 범위는 0에서 18446744073709551615입니다.

BIGINT()유형을 정의 할 때 괄호로 설정 해야하는 값은 무엇입니까 ? (INT가 휴대 전화가 가질 수있는만큼 많은 수를 보유 할 수 있는지 알지 못하기 때문에 BIGINT를 사용하고 있습니다. 아마도 잘못된 것입니다). MariaDB / MySQL 데이터베이스에서 열을 생성하는 올바른 방법은 무엇입니까?

어쨌든 나는 당신의 의견, 경험을 알고 싶습니다. 물론 대답을 얻고 싶습니다.

참고 : ER 다이어그램을 만들기 위해 MySQL Workbench 최신 버전을 사용하고 있습니다. MariaDB 10.0.x도 사용하고 있습니다.


답변:


13

"+ 1-000-000-0000 ext 1234"와 같은 내선 번호의 전화 번호는 어떻게 처리합니까?

"+"는 국제 전화 걸기 규칙을 적용해야 함을 나타냅니다. 북미에서 시스템은 국제 전화 등 앞에서 "011"을 자동으로 인식합니다.

또한 "1-800-DBA-HELP"와 같은 전화 번호는 어떻습니까?

전화 번호는 일반적으로 텍스트로 저장합니다. 그러나 전화 번호 란이 얼마나 중요한지에 달려 있습니다. 해당 열에서 자동 다이얼러를 실행하는 경우 숫자 만 포함되도록하고 데이터는 올바른 전화 번호를 나타냅니다.

내가 제공 한 "1-800-DBA-HELP"예와 같이 내선 번호와 텍스트가있는 전화 번호에 대한 별도의 열이있을 수 있습니다.


예, 숫자가 중요하기 때문에 미래에 실수하지 않을 것입니다. 숫자 만 허용 할 것입니다. 귀하의 제안은 무엇입니까? 내선 번호를 누르고 새 열을 쉽게 추가 할 수 또는 I는 다음과 같이 사람들이 숫자를 입력 만들고 싶어 1-800-DBA-HELP이 자리 년대
ReynierPM

실제로 요구 사항에 따라 다릅니다. 사람이 인식 할 수 있어야하는 경우 텍스트 기반 번호를 어딘가에, 아마도 텍스트 필드에 유지하려고합니다. 텍스트 부분이 마음에 들지 않으면 저장하지 마십시오.
Max Vernon

1
국가 코드로 전체 번호를 저장하면 INT는 확실히 크지 않습니다. BIGINT는 아마도 충분히 클 것입니다.
Max Vernon

1
최소 20 자리를 원합니다.
Max Vernon

1
MariaDB를 사용하면 계산 된 필드를 사용하여 자동 다이얼러의 숫자 만 추출 할 수 있습니다. 아마도 MySQL 5.7에서 (잘 모르겠습니다).
Vérace

2

이전에는 다음과 같이 작성되었습니다.

"MariaDB를 사용하면 computed필드를 사용 하여 자동 다이얼러의 숫자 만 추출 할 수 있습니다 . 또한 MySQL 5.7에서도 작동합니다."

이에 대한 OP의 질문에 대한 답변 ( "당신이 나에게 말하고있는 것을 조금 설명 할 수 있습니까?")에 대한 설명은 다음과 같습니다.

많은 데이터베이스 시스템이이 기능을 도입했습니다. 이 필드 는 다른 필드의 값에서 파생 된 " computed", " virtual"또는 " generated" 로 다양하게 알려진 필드입니다. 이 기능의 기능은 RDBMS에 따라 다릅니다. Oracle, Firebird, MariaDB 및 현재 MySQL 5.7에 이러한 기능이 있음을 알고 있습니다. 다른 사람들도 그렇게 할 것입니다.

쉬운 예는 성 열을 갖고 계산 된 열을 갖는 것입니다. 계산 된 열은 모든 자본으로 성을 "저장할 수 있습니다 (즉, 가상으로 계산할 수 있습니다 (즉, 가상으로 계산하거나 물리적으로 디스크에 저장할 수 있음")). 더 쉽게 검색 할 수 있습니다. 즉, 만에 검색 할 수있는 방법 CAP(말하자면, 사용의 LIKE데이터 존재가에서 검색 것을 알고)를 [ computed| virtual| generated] 입력란은 대문자로되어 있습니다.

MySQL 5.7의 개념은 여기여기에 설명 되어 있습니다 . 약간 더 오래 MariaDB에 있었고 개념도 여기에 설명되어 있습니다 . 몇 가지 가능한 사용법이 여기 에 제안 되어 있지만 실제로는 상상력에 의해서만 제한됩니다. 트리거를 대체하는 편리한 (오류가 적은) 대체물로 볼 수 있습니다.

특정 사용 사례의 경우 텍스트 필드 "+"-> "00"(또는 국제 전화 걸기 코드가 무엇이든)에서 전화 걸기 가능한 번호를 파생시킬 수 있습니다. 그냥 생각이야


좋습니다. 검색어를 추가하여 약간의 질문을 개선 할 수 있습니까? 나는 개념을 가지고 있지만 virtual또는 generated값 을 만드는 방법을 잘 모르겠습니다 . 사용 CONCAT중이거나 다른 것을 생각하고 있지만 전혀 확실하지 않습니다. 또한 CAPS사용하여 검색을 언급하면 ​​이것의 예도 LIKE넣을 수 있습니까? 즉시 계산 ( virtual) vs persisted (생성 된) 열의 성능은 어떻습니까?
ReynierPM 2016

1

흠. 전화 번호는 숫자로 구성됩니다. varchar를 사용하면 (또는 사용하지 않는 또는 포함하여) 모든 형식의 서식을 저장할 수 있으며 데이터가 빠르게 엉망이됩니다. 전화 번호 형식은 "국가"에 따라 다르며 마스크는 국가와 연결되어 있어야합니다. 확장명이며 선택 사항이므로 "확장자 필드"에 저장해야합니다. (int도) 1-800-DBA-HELP의 경우 즉시 변환하여 실제 숫자를 저장합니다. 사람이 읽을 수있는 전화 번호 # 별도의 varchar 필드에 저장하십시오.


1

나는 보통 전화 번호를 간단한 텍스트로 저장한다 . 형식화 및 표시는 클라이언트 코드에 그대로 둡니다.

여기, 당신은 어떻게 저장합니까? 그 전화 번호로 할 일은 정말 중요합니다.

회사가 시스템에서 발신 전화 를 수행하려는 경우 응용 프로그램은 숫자 만 추출합니다. 회사에서 국제 전화를 걸 려면 국가 코드와 지역 번호를 별도의 열에 저장하십시오.

귀하의 비즈니스 가보고를 원할 경우 , 애플리케이션은 내선과 숫자를 따로 따로 형식화하고 표시합니다.

내 이해에서 전화 번호에 대한 범용 데이터 모델 을 디자인 하는 것은 좋은 생각이 아닙니다. 국가마다 다른 번호, 내선 번호 및 지역 번호가 있습니다. 또한 일부 국가에는 지역 번호가 없습니다.

이것은 귀하의 질문에 대답하지 못할 수도 있지만 우리의 이해를 넓히는 데 도움이 될 것입니다. 감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.