PostgreSQL 22P06 오류 원인과 해결 방법 완벽 가이드

22P06
2026년 10월 16일 | DBMS Error 가이드

이 글에서 다루는 내용

22P06 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

22P06 nonstandard use of escape character 는?

PostgreSQL 에러 코드 22P06은 nonstandard_conforming_strings 설정이 비활성화된 상태에서 백슬래시(\)를 이스케이프 문자로 사용할 때 발생하는 경고 또는 에러입니다. SQL 표준에 따르면 일반 문자열 리터럴(작은따옴표로 감싼 문자열)에서 백슬래시는 특별한 의미를 가지지 않지만, PostgreSQL의 과거 동작 방식에서는 백슬래시를 이스케이프 문자로 처리해 왔습니다. 이 에러는 주로 레거시 애플리케이션이나 오래된 SQL 쿼리를 현대 PostgreSQL 버전으로 마이그레이션할 때 자주 마주치게 됩니다.

주요 발생 원인

  • standard_conforming_strings가 OFF인 상태에서 백슬래시 사용

PostgreSQL 9.1 이전 버전에서는 standard_conforming_strings의 기본값이 off였으며, 이 설정에서 '\n'이나 '\t'처럼 백슬래시를 이스케이프 시퀀스로 사용하는 쿼리가 허용되었습니다. 현재 PostgreSQL(9.1 이후)에서는 이 설정의 기본값이 on으로 변경되어, 이전 방식의 백슬래시 이스케이프를 그대로 사용하면 22P06 경고가 발생합니다. 특히 오래된 ORM이나 레거시 데이터베이스 드라이버를 사용하는 애플리케이션에서 이 문제가 빈번하게 발생합니다.

  • E” 구문(Escape String) 없이 백슬래시 이스케이프 문자 사용

SQL 표준을 준수하는 PostgreSQL에서 백슬래시를 이스케이프 문자로 사용하려면 반드시 E'...' 형태의 이스케이프 문자열 구문을 사용해야 합니다. 'Hello\nWorld'처럼 일반 문자열 리터럴에서 백슬래시를 사용하면, PostgreSQL은 이를 비표준 이스케이프 사용으로 판단하고 22P06 에러 또는 경고를 발생시킵니다. 이 문제는 개발자가 다른 데이터베이스(MySQL 등)의 습관대로 쿼리를 작성할 때도 흔히 발생합니다.

  • escape_string_warning 설정과 backslash_quote 설정의 충돌

escape_string_warning 파라미터가 on으로 설정된 상태(기본값)에서 비표준 백슬래시 이스케이프가 감지되면 경고 메시지가 출력됩니다. 또한 backslash_quote 파라미터 설정에 따라 작은따옴표를 \' 형태로 이스케이프하는 것이 허용되거나 금지될 수 있는데, 애플리케이션 레벨에서 이 설정을 고려하지 않고 쿼리를 작성하면 예상치 못한 에러가 발생합니다. 이 설정들은 서로 연관되어 있어 하나만 변경하면 다른 쪽에서 문제가 생길 수 있습니다.

해결 방법

원인 1 해결: standard_conforming_strings 설정 확인 및 변경

현재 설정값을 확인하고, 필요에 따라 세션 또는 데이터베이스 레벨에서 변경합니다.

-- 현재 설정 확인
SHOW standard_conforming_strings;

-- 세션 레벨에서 활성화 (권장)
SET standard_conforming_strings = on;

-- 데이터베이스 레벨에서 영구 적용
ALTER DATABASE mydb SET standard_conforming_strings = on;

-- 확인용 쿼리: 아래 두 결과가 동일해야 정상
SELECT 'Hello\nWorld';        -- standard ON: 백슬래시를 문자 그대로 처리
SELECT E'Hello\nWorld';       -- 이스케이프 문자열로 처리 (줄바꿈 포함)

원인 2 해결: E” 이스케이프 문자열 구문으로 변경

백슬래시 이스케이프가 필요한 경우, 반드시 E'...' 구문을 사용하세요.

-- 잘못된 방법 (22P06 경고 발생 가능)
SELECT 'C:\Users\postgres\data';
SELECT 'Line1\nLine2';
SELECT 'Tab\there';

-- 올바른 방법 1: E'' 이스케이프 문자열 사용
SELECT E'C:\\Users\\postgres\\data';   -- 백슬래시를 문자로 출력
SELECT E'Line1\nLine2';                 -- 실제 줄바꿈 문자 삽입
SELECT E'Tab\there';                    -- 실제 탭 문자 삽입

-- 올바른 방법 2: 백슬래시 대신 표준 SQL 이스케이프 사용
-- 윈도우 경로의 경우 백슬래시 두 번 사용
SELECT E'C:\\Program Files\\PostgreSQL\\';

-- 테이블에 데이터 삽입 예시
CREATE TABLE file_paths (
    id SERIAL PRIMARY KEY,
    file_path TEXT NOT NULL
);

-- 올바른 삽입 방법
INSERT INTO file_paths (file_path) VALUES (E'C:\\Users\\admin\\documents\\report.pdf');
INSERT INTO file_paths (file_path) VALUES ('C:/Users/admin/documents/report.pdf');  -- 슬래시 사용 권장

-- 데이터 조회 및 확인
SELECT id, file_path FROM file_paths;

원인 3 해결: escape_string_warning 및 backslash_quote 설정 조정

-- 현재 설정 전체 확인
SHOW escape_string_warning;
SHOW backslash_quote;

-- 경고를 일시적으로 비활성화 (마이그레이션 작업 시 임시 사용)
SET escape_string_warning = off;

-- backslash_quote 설정 확인 및 변경
-- 'safe_encoding': 멀티바이트 인코딩에서 안전할 때만 허용 (기본값)
-- 'on': 항상 허용 (보안 위험 있음)
-- 'off': 항상 금지
SET backslash_quote = 'safe_encoding';

-- postgresql.conf에서 전역 설정 (서버 재시작 필요)
-- escape_string_warning = on
-- backslash_quote = safe_encoding
-- standard_conforming_strings = on

-- 레거시 쿼리를 현대적으로 변환하는 예시
-- 변환 전 (구버전 PostgreSQL 방식)
-- SELECT * FROM users WHERE name = 'O\'Brien';

-- 변환 후 (표준 SQL 방식: 작은따옴표를 두 번 사용)
SELECT * FROM users WHERE name = 'O''Brien';

-- 또는 E'' 구문 사용
SELECT * FROM users WHERE name = E'O\'Brien';

마이그레이션 시 일괄 점검 쿼리

-- pg_stat_activity에서 현재 백슬래시 사용 쿼리 탐지 (예시)
SELECT pid, usename, application_name, query
FROM pg_stat_activity
WHERE query LIKE '%\\%'
  AND state = 'active';

-- 특정 함수에서 이스케이프 처리를 안전하게 하는 방법
CREATE OR REPLACE FUNCTION safe_string_example(input_text TEXT)
RETURNS TEXT AS $$
BEGIN
    -- format() 함수를 활용한 안전한 문자열 처리
    RETURN format('입력값: %s', input_text);
END;
$$ LANGUAGE plpgsql;

SELECT safe_string_example('C:\Users\test');

예방 방법

  • standard_conforming_strings = on 설정을 기본으로 고정하고, E” 구문을 팀 코딩 표준으로 채택

PostgreSQL 9.1 이후 버전에서는 standard_conforming_strings의 기본값이 on이므로, postgresql.conf와 애플리케이션 설정에서 이 값을 명시적으로 on으로 고정하여 환경에 관계없이 일관된 동작을 보장하세요. 팀 내 코딩 가이드라인에 “백슬래시 이스케이프가 필요한 경우 반드시 E'...' 구문 사용”을 명문화하고, 코드 리뷰 단계에서 일반 문자열 리터럴에 백슬래시 사용 여부를 체크리스트 항목으로 추가하세요.

  • 파라미터화된 쿼리(Prepared Statement)와 ORM 사용으로 이스케이프 문제 근본 차단

직접 문자열을 조합하는 동적 쿼리 대신, 애플리케이션 드라이버의 파라미터 바인딩 기능을 활용하면 이스케이프 관련 에러를 원천적으로 방지할 수 있습니다. 파라미터화된 쿼리는 SQL 인젝션 방어와 함께 이스케이프 문제도 동시에 해결해주므로, 신규 코드 작성 시 이를 기본 원칙으로 삼아야 합니다.

관련 에러

  • 22025 (invalid_escape_sequence): 유효하지 않은 이스케이프 시퀀스를 사용했을 때 발생하며, 22P06과 함께 자주 등장합니다.
  • 22019 (invalid_escape_character): 이스케이프 문자 자체가 잘못 지정된 경우 발생합니다. LIKE 절의 ESCAPE 옵션과 관련이 깊습니다.
  • 42601 (syntax_error): 잘못된 이스케이프 시퀀스로 인해 문자열 파싱 자체가 실패할 경우 문법 오류로 이어질 수 있습니다.
  • 22021 (character_not_in_repertoire): 인코딩 문제와 결합된 이스케이프 처리 오류 시 발생할 수 있으며, 멀티바이트 문자셋 환경에서 주의가 필요합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기