LOCATE()와 FIND_IN_SET() 함수는 모두 인자로 전달된 값에서 문자열을 검색하는 데 사용됩니다. 하지만 두 함수 사이에는 몇 가지 중요한 차이점이 존재하며, 상황에 따라 적합한 함수가 달라집니다.
주요 차이점
1. 검색 대상의 구조
FIND_IN_SET() 함수는 쉼표로 구분된 부분 문자열들을 포함하는 하나의 문자열, 즉 '문자열 목록'을 대상으로 동작합니다. 반면 LOCATE() 함수는 주어진 문자열 안에서 부분 문자열이 처음 나타나는 위치를 찾아 반환하는 방식으로 작동합니다.
2. 검색 시작 위치 지정 가능 여부
LOCATE() 함수는 선택적 위치 인자를 통해 검색 시작 지점을 자유롭게 조정할 수 있습니다. 반면 FIND_IN_SET() 함수에는 이러한 유연성이 없으며, 기본적으로 항상 첫 번째 문자열부터 검색이 시작됩니다.
3. 정수 검색 시의 적합성
정수 값을 다룰 때는 FIND_IN_SET() 함수가 LOCATE() 함수보다 훨씬 더 적합합니다. 아래 예제를 통해 그 이유를 확인해 보겠습니다.
예제
mysql> Select IF(LOCATE(2,'10,11,12,13') > 0,1,0) As result; +--------+ | result | +--------+ | 1 | +--------+ 1 row in set (0.05 sec) mysql> Select IF(FIND_IN_SET(2,'10,11,12,13') > 0,1,0)As Result; +--------+ | Result | +--------+ | 0 | +--------+ 1 row in set (0.00 sec)
위 결과 집합에서 알 수 있듯이, LOCATE() 함수는 인자 목록에 문자열 '2'가 독립적인 항목으로 존재하지 않음에도 불구하고 1을 반환했습니다. 이는 LOCATE()가 단순 부분 문자열 매칭을 수행하기 때문입니다. 즉, '12'라는 항목 내부에 '2'가 포함되어 있으므로 일치한다고 판단한 것입니다. 반면 FIND_IN_SET() 함수는 쉼표로 구분된 각 항목('10', '11', '12', '13')과 정확히 비교하기 때문에 '2'와 일치하는 항목이 없다고 올바르게 판단하여 0을 반환합니다.
따라서 쉼표로 구분된 목록에서 특정 값을 정확하게 찾고 싶다면 FIND_IN_SET() 함수를 사용하는 것이 바람직하며, 단순히 문자열 내에서 부분 문자열의 위치를 확인하려면 LOCATE() 함수가 더 적합합니다.