2026년 06월 11일 | DBMS Error 가이드
이 글에서 다루는 내용
2200C 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
2200C invalid use of escape character 는?
PostgreSQL 에러 코드 2200C (invalid use of escape character)는 SQL 문자열 내에서 이스케이프 문자를 잘못된 방식으로 사용했을 때 발생하는 에러입니다. 주로 LIKE, SIMILAR TO 등의 패턴 매칭 연산자와 함께 ESCAPE 절을 사용할 때, 또는 문자열 리터럴 내에서 백슬래시(\)를 부적절하게 사용할 때 나타납니다. 이 에러는 SQL 표준 준수 여부와 PostgreSQL의 standard_conforming_strings 설정과 밀접하게 관련되어 있으며, 특히 다른 DBMS에서 마이그레이션된 쿼리에서 자주 발생합니다.
주요 발생 원인
1. LIKE/SIMILAR TO 절에서 ESCAPE 문자를 잘못 지정한 경우
LIKE 연산자와 함께 사용하는 ESCAPE 절에 두 글자 이상의 문자열이나 특수하게 허용되지 않는 문자를 지정했을 때 이 에러가 발생합니다. SQL 표준에 따르면 ESCAPE 절에는 반드시 단일 문자만 허용됩니다. 예를 들어 ESCAPE ''처럼 빈 문자열을 지정하거나, ESCAPE '!!'처럼 두 글자를 지정하면 PostgreSQL은 이를 유효하지 않은 이스케이프 문자 사용으로 판단합니다.
2. standard_conforming_strings 설정과 백슬래시 이스케이프 충돌
PostgreSQL 9.1 이후 standard_conforming_strings 파라미터가 기본값 on으로 변경되었습니다. 이 설정이 on인 상태에서 E” (escape string) 문법 없이 일반 문자열 리터럴에서 백슬래시를 이스케이프 문자로 사용하려 하면 문제가 발생할 수 있습니다. 구버전 PostgreSQL이나 다른 DBMS 환경에서 작성된 쿼리를 그대로 사용할 경우, 이러한 설정 차이로 인해 예상치 못한 에러가 발생합니다.
3. ORM 또는 드라이버가 생성한 쿼리의 이스케이프 처리 오류
Hibernate, SQLAlchemy 등 ORM 프레임워크나 JDBC/ODBC 드라이버가 동적으로 생성하는 쿼리에서 이스케이프 문자 처리 로직에 버그가 있거나, 설정이 PostgreSQL 표준과 맞지 않을 때 이 에러가 발생합니다. 특히 사용자 입력값에 %, _, \ 등의 특수 문자가 포함되어 있을 때, ORM이 이를 자동으로 처리하는 과정에서 잘못된 이스케이프 시퀀스를 생성하는 경우가 많습니다.
해결 방법
원인 1 해결: ESCAPE 절에 단일 문자 사용
ESCAPE 절에는 반드시 하나의 문자만 지정해야 합니다. 아래는 잘못된 예시와 올바른 예시입니다.
-- ❌ 잘못된 예시: 빈 문자열 또는 두 글자 ESCAPE 지정
SELECT * FROM products WHERE name LIKE '%100\%%' ESCAPE '';
SELECT * FROM products WHERE name LIKE '%100!%_%' ESCAPE '!!';
-- ✅ 올바른 예시: 단일 문자 ESCAPE 지정
SELECT * FROM products WHERE name LIKE '%100!%%' ESCAPE '!';
SELECT * FROM products WHERE name LIKE '%_test_%' ESCAPE '\';
-- ✅ 실무 예시: 사용자 입력에 % 문자가 포함된 경우 이스케이프 처리
SELECT * FROM products
WHERE name LIKE '%50!% OFF%' ESCAPE '!';
-- ✅ SIMILAR TO와 함께 사용하는 경우
SELECT * FROM logs
WHERE message SIMILAR TO '%error![0-9]+%' ESCAPE '!';
원인 2 해결: standard_conforming_strings 설정 확인 및 E” 문법 사용
-- 현재 설정 확인
SHOW standard_conforming_strings;
-- ✅ standard_conforming_strings = on 환경에서 백슬래시 이스케이프 사용 시
-- E'' (escape string syntax) 명시적으로 사용
SELECT * FROM files WHERE path LIKE E'C:\\\\Users\\\\%';
-- ✅ 또는 이스케이프 문자를 변경하여 백슬래시 혼동 방지
SELECT * FROM files WHERE path LIKE 'C:\Users\%' ESCAPE '#';
-- ✅ 세션 레벨에서 설정 변경 (권장하지 않음, 임시 방편)
SET standard_conforming_strings = off;
SELECT * FROM files WHERE path LIKE 'C:\\Users\\%';
SET standard_conforming_strings = on; -- 반드시 원복
-- ✅ 권장: 백슬래시 대신 다른 이스케이프 문자 사용
SELECT * FROM files WHERE path LIKE 'C:/Users/%' ESCAPE '/';
원인 3 해결: ORM 및 드라이버 레벨 처리
-- ✅ PostgreSQL에서 동적 LIKE 패턴을 안전하게 처리하는 함수 작성
CREATE OR REPLACE FUNCTION safe_like_pattern(input_text TEXT)
RETURNS TEXT AS $$
BEGIN
-- %, _, \ 문자를 이스케이프 처리
RETURN replace(replace(replace(input_text, '\', '\\'), '%', '\%'), '_', '\_');
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
-- 함수 사용 예시
SELECT * FROM customers
WHERE name LIKE '%' || safe_like_pattern('홍길동_테스트') || '%' ESCAPE '\';
-- ✅ Prepared Statement를 활용한 안전한 파라미터 바인딩 (JDBC 예시 주석)
-- PreparedStatement ps = conn.prepareStatement(
-- "SELECT * FROM products WHERE name LIKE ? ESCAPE '!'");
-- ps.setString(1, "%" + escapedUserInput + "%");
-- ✅ regexp_like 또는 ~ 연산자로 대체 (이스케이프 문제 회피)
SELECT * FROM products
WHERE name ~ '50% OFF'; -- 정규식 사용으로 LIKE ESCAPE 회피
-- ✅ 실제 운영 환경 디버깅: 에러 발생 쿼리 재현 및 확인
DO $$
DECLARE
v_pattern TEXT := '%test!_%';
v_result BIGINT;
BEGIN
SELECT COUNT(*) INTO v_result
FROM information_schema.tables
WHERE table_name LIKE v_pattern ESCAPE '!';
RAISE NOTICE 'Result count: %', v_result;
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE 'Error: % - %', SQLSTATE, SQLERRM;
END;
$$;
예방 방법
1. 이스케이프 문자 처리를 위한 전용 유틸리티 함수 표준화
프로젝트 초기에 LIKE 패턴에 사용할 이스케이프 처리 함수를 공통 라이브러리로 만들어 전체 팀이 공유하는 것이 중요합니다. 아래와 같이 스키마 레벨의 공용 함수를 정의하고, 코드 리뷰 과정에서 Raw LIKE 패턴 사용 시 반드시 해당 함수를 거치도록 팀 컨벤션을 수립하세요.
-- 공통 스키마에 이스케이프 유틸리티 함수 등록
CREATE OR REPLACE FUNCTION public.escape_like(p_input TEXT, p_escape CHAR DEFAULT '!')
RETURNS TEXT AS $$
BEGIN
RETURN replace(
replace(
replace(p_input, p_escape::TEXT, p_escape::TEXT || p_escape::TEXT),
'%', p_escape::TEXT || '%'),
'_', p_escape::TEXT || '_');
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
-- 사용 예
SELECT * FROM orders
WHERE memo LIKE '%' || public.escape_like('50% 할인_특가') || '%' ESCAPE '!';
2. PostgreSQL 버전 업그레이드 및 드라이버 설정 통합 관리
postgresql.conf 또는 ALTER DATABASE 명령으로 standard_conforming_strings = on을 명시적으로 고정하고, 모든 애플리케이션 드라이버(JDBC, psycopg2 등)에서 이 설정을 인식하도록 연결 초기화 스크립트에 SET standard_conforming_strings = on을 포함시키세요. 또한 CI/CD 파이프라인에 SQL 정적 분석 도구(예: sqlfluff)를 연동하여 잘못된 이스케이프 패턴을 배포 전에 자동으로 탐지하는 체계를 구축하는 것을 강력히 권장합니다.
관련 에러
| 에러 코드 | 이름 | 설명 |
|———–|——|——|
| 22025 | invalid_escape_sequence | 유효하지 않은 이스케이프 시퀀스. E'\q'처럼 정의되지 않은 이스케이프 시퀀스 사용 시 발생 |
| 22019 | invalid_escape_character | ESCAPE 절에 지정한 문자 자체가 유효하지 않은 경우 (2200C와 가장 유사) |
| 2201B | invalid_regular_expression | SIMILAR TO 또는 regexp_* 함수에서 잘못된 정규식 패턴 사용 시 발생 |
| 42601 | syntax_error | 이스케이프 문자 오사용이 파서 단계에서 문법 오류로 처리되는 경우 |
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.