MySQL에서 전화번호 검색하기
여러 형식으로 저장된 전화번호를 검색하는 것은 MySQL과 같은 SQL 데이터베이스를 사용할 때 상당한 도전이 될 수 있습니다. 저장된 형식과 다른 형식으로 전화번호를 찾아야 하는 상황에 직면한 적이 있다면, 예를 들어 07123456
을 검색하여 (07) 123 456
을 찾고자 할 때, 당신만이 아닙니다. 이 블로그 포스트에서는 이 문제를 단계별로 해결할 수 있는 최상의 전략을 설명합니다.
도전 과제 이해하기
많은 상황에서 전화번호는 무수히 많은 방식으로 형식화될 수 있습니다. 다음은 데이터베이스에 저장된 전화번호의 몇 가지 예입니다:
027 123 5644
021 393-5593
(07) 123 456
042123456
형식을 무시하고 전화번호를 검색해야 할 때, 도전 과제는 숫자가 아닌 문자를 제거하는 데 있습니다.
표준 쿼리의 일반적인 문제
전통적인 MySQL 문자열 함수를 사용해 문자를 제거하고 전화번호를 비교하는 것은 SQL의 한계로 인해 그다지 효과적이지 않습니다:
- 간단한 쿼리를 사용할 경우 성능이 느려질 수 있으며, 특히 데이터셋이 클수록 더욱 그렇습니다.
- 이전 MySQL 버전에서는 정규 표현식의 범위가 제한적입니다.
고려해야 할 솔루션
구체적인 솔루션에 들어가기 전에 데이터셋의 크기를 평가하는 것이 중요합니다. 수백 개의 행으로 구성된 경우, 간단한 방법으로 충분할 수 있습니다. 가능한 솔루션을 정리해 보겠습니다:
1. 해시 열 만들기
제안된 접근 방법 중 하나는 전화번호 테이블에 모든 형식 문자가 제거된 해시 버전을 저장하는 추가 열을 만드는 것입니다.
-
단계:
- 기존 테이블에
phone_hash
와 같은 새로운 열을 추가합니다. - 원래 전화번호에서 모든 특수 문자를 제거하여 이 열을 채웁니다.
MD5()
또는SHA1()
와 같은 함수를 사용하여 해시를 생성합니다.
- 기존 테이블에
-
장점:
- 속도: 해시화 한 후, 이 새로운
phone_hash
열에 대한 인덱스를 설정하여 MySQL이 테이블 스캔을 수행하지 않고도 검색을 빠르게 실행할 수 있습니다. - 명확성: 이 방법은 미래의 개발자들이 쉽게 이해할 수 있는 구조적이고 유지 관리가 용이한 솔루션을 제공합니다.
- 속도: 해시화 한 후, 이 새로운
2. 클라이언트 측 처리 수행하기
데이터셋이 상대적으로 작고 크게 증가할 것으로 예상되지 않는 경우, 데이터베이스에서 모든 전화번호를 클라이언트 애플리케이션으로 가져오고, 로컬에서 검색을 수행하는 것도 고려할 수 있습니다.
-
단계:
- 전체 전화번호 데이터셋을 가져옵니다.
- 애플리케이션 내에서 숫자가 아닌 문자를 제거하는 함수를 적용합니다.
- 메모리 내에서 검색을 실행합니다.
-
장단점:
- 이 방법은 더 큰 데이터셋에 대해 서버 측 처리보다 비효율적일 수 있지만, 데이터셋의 크기가 확신될 경우 코드를 간소화하고 데이터베이스 복잡성을 줄일 수 있습니다.
3. SQL 교체 함수 사용하기 (더 큰 데이터셋에는 권장되지 않음)
이해를 돕기 위해, SQL 쿼리 내에서 중첩된 REPLACE
함수도 사용할 수 있습니다:
SELECT * FROM people
WHERE
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '(', ''), ')', ''), '-', ''), ' ', ''), '+', '')
LIKE '123456';
- 그러나 앞서 언급했듯이, 이 접근 방식은 변형된 데이터에 대한 인덱스가 없기 때문에 더 큰 테이블에 대해 느릴 수 있으며, 전체 테이블 스캔으로 이어질 수 있습니다.
결론
MySQL에서 전화번호를 검색하기 위한 최상의 솔루션은 프로젝트의 특정 요구 사항에 따라 달라질 수 있습니다. 해시 열을 사용하는 것이 명확성과 성능을 제공하는 반면, 작은 데이터셋은 클라이언트 측 처리를 선택할 수 있습니다. 어떤 경로를 선택하더라도, 미래의 성장과 유지 관리 필요를 고려하여 후속 개발자에게 복잡성을 피할 수 있도록 해야 합니다.
성능 문제나 SQL 한갈로 어려움을 겪고 있다면, 항상 옵션을 신중하게 평가하고 효율성과 유지 관리의 균형을 잡는 솔루션을 선택하세요.