SQL Server 2005에서 전화번호를 저장하려면 어떤 데이터 유형을 사용해야 합니까?

StackOverflow https://stackoverflow.com/questions/75105

  •  09-06-2019
  •  | 
  •  

문제

전화번호를 테이블에 저장해야 합니다.어떤 데이터 유형을 사용해야 하는지 제안해 주세요.기다리다.답장을 누르기 전에 읽어보세요..

영업 담당자가 검색(와일드 문자 검색 포함)에 이 필드를 사용할 수 있으므로 이 필드를 많이 색인화해야 합니다.

현재로서는 전화번호가 다양한 형식(XML 파일)으로 제공될 것으로 예상됩니다.균일한 형식으로 변환하려면 파서를 작성해야 합니까?수백만 개의 데이터(중복 포함)가 있을 수 있으며 일부 소스 데이터가 나올 때마다 서버 리소스(과도한 전처리 등의 활동)를 묶고 싶지 않습니다.

어떤 제안이라도 환영합니다..

업데이트: 나는 소스 데이터를 통제할 수 없습니다.단지 xml 파일의 구조가 표준이라는 것뿐입니다.XML 구문 분석을 최소한으로 유지하고 싶습니다.데이터베이스에 저장되면 검색이 빨라야 합니다.여기에서 진행되고 있는 한 가지 미친 제안은 Ajax AutoComplete 기능과도 작동해야 한다는 것입니다(그래서 영업 담당자는 일치하는 항목을 즉시 볼 수 있습니다).어머나!!

도움이 되었습니까?

해결책

여기에는 다음이 포함됩니까?

  • 국제번호?
  • 확장?
  • 실제 번호 이외의 다른 정보(예: "바비를 요청하세요")?

이들 모두가 '아니요'인 경우 10자 필드를 사용하고 숫자가 아닌 모든 데이터를 제거합니다.첫 번째 항목이 예이고 나머지 두 개는 아니요인 경우 두 개의 varchar(50) 필드를 사용합니다. 하나는 원래 입력용이고 다른 하나는 숫자가 아닌 모든 데이터가 스트라이프되어 인덱싱에 사용됩니다.2개 또는 3개가 '예'인 경우 확장 또는 기타 데이터가 무엇인지 확인하고 적절하게 처리하기 위해 두 개의 필드와 일종의 미친 파서를 수행할 것 같습니다.물론 인덱스를 생성할 때 추가 문자를 제거하는 인덱스 작업을 수행하여 두 번째 열을 피할 수 있지만 두 번째 열을 만들고 아마도 트리거를 사용하여 문자 제거를 수행할 것입니다.

업데이트:AJAX 문제를 해결하려면 생각만큼 나쁘지 않을 수도 있습니다.이것이 현실적으로 테이블에 수행되는 주요 방법이라면 앞서 말했듯이 보조 열에 숫자만 저장한 다음 해당 열의 인덱스를 클러스터형 인덱스로 만드십시오.

다른 팁

우리는 varchar(15)를 사용하고 확실히 해당 필드에 대한 인덱스를 사용합니다.

그 이유는 국제 표준이 최대 15자리까지 지원할 수 있기 때문입니다.

Wikipedia - 전화번호 형식

국제 전화번호를 지원하는 경우, 미국으로 반환되는 통화를 제한하기 위해 전화번호 필드의 길이를 구문 분석하고 확인하는 일이 없도록 쿼리를 더 효과적으로 필터링하기 위해 세계 지역 코드 또는 국가 코드를 별도로 저장할 것을 권장합니다. 예

미국 전화번호만 저장하는 경우 CHAR(10)을 사용하세요.숫자를 제외한 모든 것을 제거하십시오.

나는 아마도 여기서 명백한 것을 놓쳤을 것입니다. 그러나 가장 긴 예상 전화 번호에 대해 충분히 긴 varchar가 잘 작동하지 않습니까?

만약 내가 ~이다 뭔가 뻔한게 빠졌는데 누가 지적해줬으면 좋겠는데...

저는 varchar(22)를 사용하겠습니다.내선 번호가 포함된 북미 전화번호를 담을 수 있을 만큼 충분히 큽니다.불쾌한 '(', ')', '-' 문자를 모두 제거하거나 모두 하나의 통일된 형식으로 구문 분석하고 싶을 것입니다.

알렉스

SQL Server 2005는 인덱싱된 varchar 필드의 텍스트에 대한 하위 문자열 쿼리에 매우 최적화되어 있습니다.2005년에는 인덱스 필드의 문자열 요약에 새로운 통계가 도입되었습니다.이는 전체 텍스트 검색에 큰 도움이 됩니다.

varchar를 사용하는 것은 매우 비효율적입니다.돈 유형을 사용하고 그 중에서 사용자 선언 유형 "phonenumber"를 생성하고 양수만 허용하는 규칙을 생성합니다.

(19,4)로 선언하면 4자리 내선 번호도 저장할 수 있고 국제 전화번호를 저장할 수 있을 만큼 커질 수 있으며 저장 공간은 9바이트만 차지합니다.또한 인덱스가 빠릅니다.

전처리를 통해 nvarchar를 사용하여 최대한 표준화합니다.확장명을 추출하여 다른 필드에 저장하고 싶을 수도 있습니다.

데이터를 정규화한 다음 varchar로 저장합니다.정규화하는 것은 까다로울 수 있습니다.

일회성 히트여야 합니다.그런 다음 새 기록이 들어오면 이를 정규화된 데이터와 비교합니다.매우 빨라야 합니다.

다양한 전화번호 형식을 수용해야 하기 때문에(아마도 확장명 등을 포함할 수도 있음) 다른 varchar와 마찬가지로 처리하는 것이 가장 합리적일 수 있습니다.입력을 제어할 수 있다면 데이터를 더욱 유용하게 만들기 위해 다양한 접근 방식을 취할 수 있지만 그렇게 들리지는 않습니다.

단순히 다른 문자열로 처리하기로 결정하면 잘못된 데이터, 알 수 없는 전화번호 형식 및 기타 팝업과 관련된 불가피한 문제를 극복하는 데 집중할 수 있습니다.문제는 데이터에 대한 좋은 검색 전략을 구축하는 것이지 내 생각으로는 데이터를 저장하는 방법이 아닙니다.수집할 수 없는 대량의 데이터 더미를 처리하는 것은 항상 어려운 작업입니다.

SSIS를 사용하여 정보를 추출하고 처리합니다.이렇게 하면 SQL Server에서 분리된 XML 파일을 처리하게 됩니다.필요한 경우 별도의 서버에서 SSIS 변환을 수행할 수도 있습니다.VARCHAR을 사용하여 전화번호를 표준 형식으로 저장합니다.NVARCHAR은 숫자와 '+', '', '(', ')' 및 '-'와 같은 다른 문자 몇 개에 대해 이야기하고 있으므로 불필요합니다.

사용 varchar 길이 제한이 있는 필드입니다.

확장자를 나타내기 위해 "x" 또는 "ext"를 사용하는 것이 매우 일반적이므로 15자(완전한 국제 지원의 경우) + 3("ext"의 경우) + 4(확장자 자체의 경우)를 허용하여 총 22자를 허용합니다. .그러면 당신이 안전해질 것입니다.

또는 입력 시 정규화하여 모든 "ext"가 "x"로 변환되어 최대 20개를 제공합니다.

이 스레드는 오래되었지만 특히 .NET 프레임워크에서 서식 지정을 위해 숫자 유형으로 저장하는 이점을 언급할 가치가 있습니다.

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string

전화번호와 같은 다중 값 속성에 대해 별도의 테이블을 갖는 것이 항상 더 좋습니다.

소스 데이터에 대한 통제권이 없기 때문에 특정 국가의 형식에 문제가 없도록 XML 파일의 데이터를 구문 분석하고 적절한 형식으로 변환하고 별도의 테이블에 저장할 수 있습니다. 인덱싱과 검색 모두 효율적입니다..

감사합니다.

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