PHP의 basename() 함수는 파일 경로가 포함된 문자열을 입력받으면 해당 파일의 기본 이름(base name)만 반환하는 함수입니다. 그렇다면 MySQL에서도 이와 동일한 기능을 사용할 수 있을까요? 정답은 SUBSTRING_INDEX() 함수를 활용하면 가능하다는 것입니다.
예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable -> ( -> Location varchar(200) -> ); Query OK, 0 rows affected (1.02 sec)
데이터 삽입하기
INSERT 명령어를 사용하여 파일 경로 데이터를 몇 개 삽입합니다.
mysql> insert into DemoTable values('C:\Web\Sum.java');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('E:\WebDevelopment\Image1.png');
Query OK, 1 row affected (0.42 sec)저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+------------------------------+ | Location | +------------------------------+ | C:\Web\Sum.java | | E:\WebDevelopment\Image1.png | +------------------------------+ 2 rows in set (0.00 sec)
SUBSTRING_INDEX()로 파일 이름만 추출하기
이제 MySQL에서 basename() 함수와 동일한 결과, 즉 파일의 기본 이름을 얻는 쿼리를 살펴보겠습니다. 핵심은 SUBSTRING_INDEX() 함수를 경로 구분자인 역슬래시(\\)와 함께 사용하고, 세 번째 인자로 -1을 지정하여 마지막 구분자 뒤의 문자열을 가져오는 것입니다.
mysql> select Location, -> SUBSTRING_INDEX(Location,'\\', -1) AS NameOfFile from DemoTable;
출력 결과
+------------------------------+------------+ | Location | NameOfFile | +------------------------------+------------+ | C:\Web\Sum.java | Sum.java | | E:\WebDevelopment\Image1.png | Image1.png | +------------------------------+------------+ 2 rows in set (0.00 sec)
동작 원리
SUBSTRING_INDEX(str, delim, count) 함수는 count 값에 따라 다르게 동작합니다. count가 음수이면 문자열 끝에서부터 지정한 구분자의 개수를 세고, 마지막 구분자 오른쪽에 있는 부분 문자열을 반환합니다. 따라서 -1을 사용하면 경로 전체에서 가장 마지막 요소인 파일 이름만 깔끔하게 추출할 수 있습니다. 만약 유닉스 계열 경로처럼 슬래시(/)를 구분자로 사용한다면 SUBSTRING_INDEX(Location, '/', -1) 형태로 변경하면 됩니다.