2026년 10월 19일 | DBMS Error 가이드
이 글에서 다루는 내용
2200C 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
2200C invalid use of escape character 는?
PostgreSQL 에러 코드 2200C는 SQL 문자열 내에서 이스케이프 문자(escape character)가 잘못된 방식으로 사용되었을 때 발생하는 오류입니다. 주로 LIKE 또는 SIMILAR TO 절에서 ESCAPE 키워드와 함께 사용되는 이스케이프 문자가 단일 문자가 아니거나, 표준 SQL 문자열 리터럴에서 백슬래시(\)를 잘못 사용할 때 트리거됩니다. 이 에러는 PostgreSQL의 엄격한 SQL 표준 준수 정책으로 인해 발생하며, 특히 standard_conforming_strings 설정이 on으로 되어 있는 환경(PostgreSQL 9.1 이후 기본값)에서 자주 마주치게 됩니다.
주요 발생 원인
- LIKE 절에서 ESCAPE 문자를 두 글자 이상으로 지정한 경우
LIKE 패턴 매칭에서 ESCAPE 키워드 뒤에 오는 문자는 반드시 단일 문자(single character)여야 합니다. 두 글자 이상의 문자열을 이스케이프 문자로 지정하면 PostgreSQL은 즉시 2200C 에러를 발생시킵니다. 이는 SQL 표준(SQL:2003)에서 ESCAPE 문자를 단일 문자로 엄격히 제한하고 있기 때문입니다.
“`sql
— 잘못된 예시: 이스케이프 문자가 두 글자 이상
SELECT * FROM products
WHERE product_code LIKE ’10\%sale’ ESCAPE ‘\\’;
— ERROR: invalid use of escape character (SQLSTATE 2200C)
“`
- standard_conforming_strings 설정과 백슬래시 혼용 문제
PostgreSQL 9.1부터 standard_conforming_strings의 기본값이 on으로 변경되면서, 일반 단따옴표 문자열 내의 백슬래시(\)는 더 이상 이스케이프 문자로 처리되지 않습니다. 하지만 레거시 코드나 다른 DBMS에서 마이그레이션된 쿼리에서 \를 이스케이프 문자로 사용하는 경우가 많아 충돌이 발생합니다. 이 설정 차이를 인지하지 못한 채 쿼리를 작성하면 예상치 못한 2200C 에러를 마주치게 됩니다.
“`sql
— 잘못된 예시: standard_conforming_strings=on 환경에서 백슬래시 남용
SELECT * FROM logs
WHERE message LIKE ‘error\_%’ ESCAPE ‘\’;
— 백슬래시가 단일 문자로 인식되지 않을 수 있음
“`
- 빈 문자열(”)을 ESCAPE 문자로 지정한 경우
일부 개발자는 이스케이프 처리를 비활성화하려는 목적으로 ESCAPE ''와 같이 빈 문자열을 지정합니다. 그러나 SQL 표준에 따르면 이스케이프 문자는 반드시 정확히 하나의 문자여야 하므로, 빈 문자열을 사용하는 것도 2200C 에러를 유발합니다. 이 경우는 특히 ORM 프레임워크나 동적 쿼리 생성기에서 자동으로 생성된 SQL에서 자주 발견됩니다.
“`sql
— 잘못된 예시: 빈 문자열 이스케이프 문자
SELECT * FROM customers
WHERE email LIKE ‘%@example.com%’ ESCAPE ”;
— ERROR: invalid use of escape character (SQLSTATE 2200C)
“`
해결 방법
원인 1 해결: ESCAPE 문자를 단일 문자로 수정
ESCAPE 뒤에 오는 문자는 반드시 하나의 문자만 지정해야 합니다. 가장 관용적으로 쓰이는 이스케이프 문자는 !, #, \ 중 하나입니다.
-- 올바른 예시: 단일 문자 이스케이프 사용
SELECT * FROM products
WHERE product_code LIKE '10!%sale' ESCAPE '!';
-- 백슬래시를 단일 이스케이프 문자로 사용
SELECT * FROM products
WHERE product_code LIKE '10\%sale' ESCAPE '\';
-- 실무 예시: 특수문자가 포함된 검색어 처리
SELECT product_name, product_code
FROM products
WHERE product_code LIKE '%50!%%' ESCAPE '!'
ORDER BY product_name;
원인 2 해결: E-string 리터럴 또는 표준 방식으로 전환
standard_conforming_strings=on 환경에서 백슬래시를 이스케이프 문자로 사용하려면, PostgreSQL 전용 E'' 문자열 접두사를 사용하거나 다른 이스케이프 문자를 선택하는 것이 권장됩니다.
-- 현재 설정 확인
SHOW standard_conforming_strings;
-- E-string 방식으로 명시적 이스케이프 처리
SELECT * FROM logs
WHERE message LIKE E'error\\_%' ESCAPE '\';
-- 더 안전한 방법: 다른 이스케이프 문자 사용
SELECT * FROM logs
WHERE message LIKE 'error#_%' ESCAPE '#';
-- 실무 예시: 동적 검색어에서 특수문자 안전 처리
CREATE OR REPLACE FUNCTION safe_like_search(search_term TEXT)
RETURNS TABLE(log_id INT, message TEXT) AS $$
BEGIN
RETURN QUERY
SELECT l.log_id, l.message
FROM logs l
WHERE l.message LIKE '%' || REPLACE(REPLACE(search_term, '!', '!!'), '%', '!%') || '%' ESCAPE '!';
END;
$$ LANGUAGE plpgsql;
원인 3 해결: 이스케이프 비활성화가 필요한 경우 대안 사용
이스케이프 처리 자체가 필요 없는 경우, ESCAPE 절을 아예 사용하지 않거나 ~~ 연산자를 활용하는 방법을 고려하세요.
-- ESCAPE 절 없이 일반 LIKE 사용 (% 와 _ 만 와일드카드로 동작)
SELECT * FROM customers
WHERE email LIKE '%@example.com';
-- 정규식을 활용한 대안
SELECT * FROM customers
WHERE email ~ '@example\.com$';
-- 빈 이스케이프 대신 NULL ESCAPE 사용 (PostgreSQL에서 지원)
-- 단, 이는 표준이 아닌 확장 문법
SELECT * FROM customers
WHERE email LIKE '%@example.com%' ESCAPE NULL;
-- 또는 아예 ESCAPE 절 생략
예방 방법
- 쿼리 작성 시 이스케이프 문자 전처리 함수를 표준화하여 사용하세요
팀 내에서 LIKE 검색에 사용되는 이스케이프 처리 로직을 별도의 함수로 추출하고, 모든 동적 쿼리가 해당 함수를 통해 생성되도록 코딩 컨벤션을 정립하세요. 아래와 같이 공통 유틸리티 함수를 정의해 두면 실수를 방지할 수 있습니다.
“`sql
— 팀 공통 이스케이프 전처리 함수
CREATE OR REPLACE FUNCTION escape_like_pattern(pattern TEXT)
RETURNS TEXT AS $$
BEGIN
RETURN REPLACE(REPLACE(REPLACE(pattern, ‘!’, ‘!!’), ‘%’, ‘!%’), ‘_’, ‘!_’);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
— 사용 예시
SELECT * FROM products
WHERE product_name LIKE ‘%’ || escape_like_pattern(‘50% OFF’) || ‘%’ ESCAPE ‘!’;
“`
standard_conforming_strings설정을 명시적으로 확인하고 프로젝트 문서화하세요
신규 프로젝트를 시작하거나 레거시 시스템을 마이그레이션할 때는 반드시 SHOW standard_conforming_strings;를 통해 현재 설정을 확인하고, 그 결과를 팀 내 문서에 기록해 두세요. 특히 MySQL, Oracle 등 다른 DBMS에서 PostgreSQL로 마이그레이션하는 경우 이 설정 차이로 인해 수많은 쿼리가 영향을 받을 수 있으므로, 마이그레이션 초기 단계에서 전체 쿼리를 감사(audit)하는 것을 권장합니다.
관련 에러
22025(invalid escape sequence): 이스케이프 문자 자체는 올바르게 지정되었으나, 이스케이프 시퀀스가 유효하지 않은 문자를 참조할 때 발생합니다.2200C와 함께 자주 쌍으로 발생하므로 함께 점검이 필요합니다.
22019(invalid escape character):LIKE절에서 이스케이프 문자가 단일 바이트가 아닌 멀티바이트 문자(예: 한글, 이모지)로 지정될 때 발생하며,2200C와 유사한 맥락에서 나타납니다.
42601(syntax error): 이스케이프 문자 관련 SQL 문법 자체가 파싱 단계에서 오류를 유발할 경우2200C이전에42601이 먼저 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.