2008-11-14 8 views
18

근무한 지난 3 개 기업에서 전화 번호 열의 유형은 varchar (n)입니다. 확장 기능을 저장하려는 이유 (내선 333). 그러나 모든 경우에 "-"문자는 삽입 및 업데이트 할 때 제거됩니다. 나는 왜 ".ext"문자가 "-"문자를 저장하는 것이 좋지만 이해할 수 없는지 이해하지 못한다. 다른 사람이 이걸 본 적이 있습니까?이 방법으로 설명하면 어떤 설명이 가능합니까? 저장할 모든 것이 숫자라면 int 필드를 사용하는 것이 더 좋지 않습니까? 반대로 숫자를 문자열/varchar로 저장하려면 모든 문자를 유지하고 화면에 서식을 지정하고 쓰기를 할 때 걱정하지 않으시겠습니까?데이터베이스의 전화 번호 열

전화 번호 저장이 다른 장소에서 구현되는 다른 방법에 대해서도 듣고 싶습니다. 저장 전화 번호

+4

@Onorio : 어떻게 작동할까요? 정확한 복제물로 닫으려면 투표하십시오. 하향 투표하지 마십시오. – mpen

+0

나는 투표 할 수있는 능력이 없다는 것을 기억하는 것 같습니다. 그러나 나는 미래의 사례들을 염두에두고 그것을 염두에 둘 것이다. –

답변

12

1 점 선두 0

예이다 : 01,202 8,765,432

하는 int 열에서 0은 전화 번호가 유효하게되는 스트리핑한다.

난에서 짐작 것 - 실제로 무엇을

예를 들면 의미 해달라고하기 때문에 공간에 대한 교환되는 : 123-456-789 = 123 456 789 = 123456789

+2

0을 선도하는 것은 전화 번호를위한 문자열을 고집하는 데 훌륭한 포인트입니다 ... – Codewerks

29

빠른 검사 : 가시나요을 전화 번호를 더하기/빼기/곱하기/나누기? 아니. SSN과 마찬가지로 전화 번호는 실제 숫자를 포함 할 수있는 개별 데이터이므로 문자열 유형이 가장 적절할 수 있습니다.

+2

큰 논리. 수치를 숫자로 생각하는 정신에 빠지기는 너무 쉽습니다. 너 너무 옳아. 여기서 숫자는 실제로 숫자가 아니라 문자열/텍스트/varchar 유형입니다. 나는 누군가가 내가 만들어내는 것을 깨닫지 못하고 내가 정한 가정을 지적 할 때 사랑한다. – Dinah

+0

예, 문자열 제약 조건은 검사 제약 조건이있는 한 가장 적합합니다. –

+0

동의. 우편 번호, 거리 번호는 숫자를 만들고 싶지 않은 필드의 좋은 예입니다. – dpurrington

0

일부 문자를 스트리핑 및 데이터베이스 테이블은, 예를 다른 시스템을 구동하려고하면 다른 사람을 허용하는 것은 영향을 미칠 수 있습니다 어떤 종류의 IP 텔레포니. 관련된 시스템에 따라 접미사로 등 .333을 갖는 것이 합법적 일 수 있지만 개발자는 문자열에서 "-"을 차지하지 않을 수도 있습니다. (예, 여기에서 추측합니다 ...)

As int가 아닌 varchar로 저장하기 위해, 이것은 나에게 평범한 일반적인 상식이다. 앞에서 언급했듯이, 앞에 오는 0은 int 필드에서 제거 될 수 있습니다. int 필드의 쿼리는 암시 적 수학 함수를 수행 할 수 있습니다.이 함수는 텍스트에서 "-"을 제거 할 수 있다고 설명 할 수도 있지만 555-1234를 입력하고 싶지는 않습니다. 그것은 -679 당신을 나는 정확한 이유를 모르겠다)? 한마디로

를 저장하지만, 몇 가지 가능성을 추론 할 수있다.

+0

사람이 읽을 수있는 형식으로 데이터를 저장 한 다음 필요한 문자를 즉시 ​​구문 분석하여 보내기 전에 전화 시스템에 연결합니다. – Kibbee

+0

아마 그렇 겠지. 나는 시스템을 설계하지 않고 가능한 설명 만 제공합니다. :) – ZombieSheep

3

개인적으로 전화 번호의 출처에 따라 다른 문자를 제외하지 않을 수도 있습니다. 전화 번호를 입력 한 정확한 형식으로 전화 번호를 남겨 둡니다. 입력 한 사람이 그것을 보는 데 익숙합니다.

0
내가 문자열로 숫자를 저장하고 여러 가지를 추가하도록 선택할 것

"()"와 "-"내 디스플레이 코드입니다. 국제 전화 번호로는 더 어려워집니다. 우리는 국가에 따라 다양한 "국제화 된"디스플레이 형식을 사용하여 처리합니다.

1

그것은 정말 문제가 당신이 그것을 저장하지 않는 방법, 한이 일관된한다. 규범은 포맷팅 문자를 제거하는 것이지만, 국가 코드, 지역 코드, 교환 및 확장을 별도로 저장할 수 있습니다. 다시 말하지만, 요구 사항은 일관성이 있습니다. 그렇지 않은 경우 쿼리는 PITA입니다.

0

전화 번호가 북미와 같이 특정 지역에만있을 것이라는 것을 알고 싶다면 입력란을 4 개의 입력란으로 변경해야합니다. 지역 코드는 3 개, 접두어는 3 개, 회선은 3 개, 확장자는 5 개입니다.그런 다음 '-'및 확장자를 지정하는 'e'가있는 1 개의 필드로 삽입합니다. 물론 모든 검색은 동일한 프로세스를 따라야합니다. 이렇게하면 더 많은 정규 데이터를 얻을 수있게되고 심지어는 전화 번호부가 실제로 제거 된 후에 전화 번호를 사용할 수있게됩니다. 나는 또한 쉽게 원래의 4 필드로 돌아갈 수 있습니다.

0

좋은 물건! 요점은 전화 번호 형식이 실제로 데이터의 일부가 아니라 원본 국가의 일부분이라는 것입니다. 여전히 숫자의 확장 부분을 그대로 유지하면 서식에서 데이터를 분리하는 모델이 손상 될 수 있습니다. 모든 국가가 확장을 설명하기 위해 동일한 구문/형식을 사용하는 것은 의심 스럽습니다. 또한 전화 시스템과의 통합이 (가능한) 요구 사항이라면 확장을 별도로 저장하고 예상대로 메시지를 작성하는 것이 좋습니다. 그러나 Mark는 또한 일관성이 있다면 일관되게 쿼리하고 처리 할 수 ​​있으므로 저장소를 저장하는 방법과 상관이 없다는 점을 강조합니다.

에릭에게 다른 질문에 대한 링크를 제공해 주셔서 감사합니다.

1

전화 번호를 '숫자'로 저장하지 말고 문자 스트링으로 생각하는 또 다른 이유는 데이터베이스에 액세스 할 때 사용하는 소프트웨어 스택의 충분한 부분 일 것입니다 (PHP, 나는 당신을보고 있습니다.)는 더 길거나 이국적인 전화 번호를 저장할 수 있도록 충분히 큰 정수 (기본적으로)를 지원하지 않습니다.

가장 많은 32 비트, 부호없이, 예를 들어, 수 그래서 4959261234.

을, 다만 어떤 러시아어 휴대 전화 번호를 작동하지 것 4294967295입니다 수행 할 수 있습니다 당신은 자신을 가지고 32 비트 이상의 숫자 데이터를 전달하는 방법을 찾는 데는 불편을 겪습니다. 데이터베이스가 오랫동안 아주 큰 정수를 오랫동안 지원해 왔음에도 불구하고 체인점에 단 하나의 나쁜 링크 만 있으면됩니다. PHP와 마찬가지로.

0

자동 전화 시스템이 필드를 사용하여 전화를 걸면 사용해야하는 문자와 전화 걸기에서 무시해야 할 문자를 구분할 수 없습니다. 인간은 "("또는 ")"또는 "-"문자를 볼 수 있으며 전화 번호의 지역 번호, npa 및 nxx를 구분하는 구분 기호로 간주됩니다. 각 문자는 자동 다이얼러에 의해 무시되도록 사전 프로그래밍되지 않은 한 이진 패턴을 나타냅니다. 이것을 설명하기 위해 사용자가 전화 핸드셋에서 누르는 문자와 동일한 값을 저장하는 것이 더 좋으며 다이얼 러가 문자열을 구문 분석하지 않고도 개별 필드를 사용할 수 있도록 개별 값을 별도의 열에 저장하는 것이 좋습니다.

전화 걸기 자동화를 사용하지 않더라도 나중에 업데이트 할 필요가없는 것을 저장하는 것이 좋습니다. 필드 사이에 문자를 추가하는 것이 문자열에서 문자열을 제거하는 것보다 훨씬 쉽습니다.

위의 설명과 같이 문자열 대 정수 데이터 형식을 사용하는 주석에는 국가 간 변형을 기반으로 전화 번호를 저장하는 적절한 방법이 있습니다. 그러나보고에 대한 통계 (즉, 얼마나 많은 숫자 또는 호출의 합) 문자열이 정수보다 훨씬 느리게 계산되는 동안 통계에 중요한 주의점이 있습니다. 이를 고려하여 varchar 또는 char 필드 데이터 유형 대신 계수에 사용할 수있는 식별 열로 정수를 추가하는 것이 중요합니다.