MariaDB / 함수 / REPLACE / 문자열 찾아서 바꾸는 함수
MariaDB의 REPLACE(원본, 찾을 문자열, 바꿀 문자열)는 원본에서 일치하는 문자열을 모두 치환한 결과를 반환합니다. 검색은 대소문자를 구분하고, SELECT에서 호출하면 저장된 원본은 그대로입니다. 열 값을 실제로 수정하려면 UPDATE의 SET에서 함수를 사용하되 먼저 대상과 변환 결과를 확인해야 합니다.
세 인수와 기본 치환 결과
REPLACE 문자열 함수 문서의 str은 원본, from_str은 찾을 문자열, to_str은 대체 문자열입니다. 첫 번째 일치만 바꾸는 함수가 아니라 일치하는 부분을 모두 처리합니다. 아래는 테이블 없이 MariaDB 접속에서 실행할 수 있습니다.
SELECT REPLACE('ababab', 'b', 'c') AS all_matches,
REPLACE('abc ABC abc', 'abc', 'xyz') AS case_sensitive,
REPLACE('a-b-c', '-', '') AS remove_hyphens,
REPLACE('abc', 'x', 'y') AS not_found,
REPLACE('abc', '', 'X') AS empty_search,
REPLACE('abc', 'a', NULL) AS null_replacement;
결과는 차례대로 acacac, xyz ABC xyz, abc, abc, abc, NULL입니다. 빈 대체 문자열은 일치 구간을 제거하고, 찾을 값이 없거나 빈 검색 문자열이면 이 예제에서는 원본이 그대로입니다. 인수 중 하나가 NULL이면 결과도 NULL이므로 “값을 지우기 위해 NULL로 치환”하는 것과 빈 문자열로 제거하는 것을 구분하세요.
REPLACE의 검색은 대소문자를 구분합니다. 열의 일반 비교나 LIKE가 대소문자를 구분하지 않는 정렬 규칙을 사용해도, REPLACE가 ABC를 abc로 자동 간주하는 것은 아닙니다. 검색 조건과 실제 치환 규칙이 같은지 따로 확인해야 합니다.
고정 문자열이며 정규식이나 재귀 치환이 아님
SELECT REPLACE('a.b.c', '.', '-') AS literal_dot,
REPLACE('aaa', 'aa', 'X') AS overlapping_input,
REPLACE('a', 'a', 'aa') AS longer_replacement,
REPLACE(REPLACE('ab', 'a', 'b'), 'b', 'c') AS chained;
결과는 a-b-c, Xa, aa, cc입니다. 마침표는 정규식의 임의 문자 의미가 아니라 마침표 자체입니다. aaa에서 aa를 바꾼 결과를 겹쳐서 다시 처리하거나, 새로 넣은 aa를 같은 호출에서 무한히 다시 바꾸지는 않습니다. 반면 함수를 중첩하면 바깥 호출이 안쪽 결과를 다시 처리하므로 치환 순서에 따라 원하지 않은 연쇄 변경이 생길 수 있습니다.
위치와 길이를 알고 특정 구간 한 곳만 바꾸려면 INSERT 문자열 함수의 위치 기반 교체가 더 맞을 수 있습니다. 패턴 검색이나 대소문자 무시 규칙이 필요하면 해당 요구를 별도로 정의하고, REPLACE에 정규식 문법을 넣는 것으로 해결하려 하지 않습니다.
테이블에서 대상과 변경 결과 미리 보기
실습용 learning 데이터베이스에서 CREATE·INSERT·SELECT·UPDATE 권한으로 다음을 실행합니다. replace_text_demo가 이미 있으면 다른 실습 이름을 사용합니다. 실제 운영 자료를 가져오지 않고 짧은 합성 텍스트만 만듭니다.
USE learning;
CREATE TABLE replace_text_demo (
id INT PRIMARY KEY,
text_value VARCHAR(200) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO replace_text_demo VALUES
(1, 'abc abc'), (2, 'ABC abc'), (3, 'ABC'),
(4, NULL), (5, 'unchanged');
SELECT id, text_value AS before_value,
REPLACE(text_value, 'abc', 'xyz') AS after_value
FROM replace_text_demo
WHERE BINARY text_value LIKE '%abc%'
ORDER BY id;
조회되는 행은 id=1·2입니다. 변경 결과는 각각 xyz xyz와 ABC xyz이고, 대문자 ABC만 있는 id=3은 제외됩니다. 여기서는 BINARY 표현식으로 LIKE 검색도 대소문자를 구분하도록 정했습니다. 일반 LIKE 조건으로 후보를 넓게 잡을 수는 있지만, 그 후보 수를 실제 REPLACE 변경 행 수와 같다고 가정하지 않습니다. 이 조회는 원본을 바꾸지 않습니다.
UPDATE 적용을 실습하고 ROLLBACK으로 취소
UPDATE에서는 바꿀 열에 REPLACE 결과를 대입합니다. 아래는 앞의 InnoDB 테이블에서 같은 접속 세션으로 실행하는 전체 확인 블록입니다. 트랜잭션 안의 FOR UPDATE 조회로 대상 행을 확인한 뒤 같은 조건으로 수정하고, 이 실습에서는 ROLLBACK으로 취소합니다.
START TRANSACTION;
SELECT id, text_value
FROM replace_text_demo
WHERE BINARY text_value LIKE '%abc%'
ORDER BY id FOR UPDATE;
UPDATE replace_text_demo
SET text_value = REPLACE(text_value, 'abc', 'xyz')
WHERE BINARY text_value LIKE '%abc%';
SELECT ROW_COUNT() AS changed_rows;
SELECT id, text_value FROM replace_text_demo ORDER BY id;
ROLLBACK;
SELECT id, text_value FROM replace_text_demo ORDER BY id;
changed_rows는 2입니다. 취소 전 id=1·2는 xyz xyz·ABC xyz이고 나머지는 그대로입니다. ROLLBACK 후에는 abc abc·ABC abc로 돌아와야 합니다. 트랜잭션을 유지하는 동안 불필요하게 기다리면 잠금이 길어질 수 있으므로 실제 작업의 검토·반영 절차를 미리 준비합니다.
실제 값을 확정할 때는 최신 대상과 예상 결과를 다시 확인한 뒤 COMMIT으로 마칩니다. 예제는 취소를 보여 주므로 그대로 실행하면 변경이 저장되지 않습니다. 오류가 나면 다음 문장으로 강행하지 말고 현재 트랜잭션을 취소하세요. 이미 자동 커밋되었거나 COMMIT한 변경을 나중의 ROLLBACK으로 되돌릴 수는 없으므로 운영 작업에는 변경 전 백업과 복구 계획이 필요합니다.
REPLACE 문과 혼동하지 않기
여기서 다룬 REPLACE()는 문자열 값을 반환하는 함수입니다. REPLACE INTO 문는 키 충돌 시 기존 행을 삭제·삽입하는 방식의 데이터 변경 구문이며 문자열 치환과 다릅니다. 이름이 같다는 이유로 텍스트 일부를 바꾸는 작업에 REPLACE INTO를 사용하지 마세요.
여러 열이나 많은 행을 바꾸려면 어떤 문자열이 몇 번 들어 있는지, 대체 후 최대 길이와 제약을 넘지 않는지, 이력이 필요한지 확인합니다. WHERE를 생략하면 모든 행을 대상으로 표현식을 평가하므로 대상 조건을 명시하고, 작은 실습에서 확인한 결과를 운영 규모의 잠금·실행 시간까지 검증한 것으로 해석하지 않습니다.




