2026년 06월 08일 | DBMS Error 가이드
이 글에서 다루는 내용
22P06 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
22P06 nonstandard use of escape character 는?
PostgreSQL 에러 코드 22P06은 문자열 리터럴 내에서 이스케이프 문자(\)가 표준 SQL 방식이 아닌 비표준 방식으로 사용될 때 발생하는 경고(Warning) 성격의 에러입니다. 기본적으로 PostgreSQL은 standard_conforming_strings 설정이 on인 경우 백슬래시(\)를 일반 문자로 처리하지만, 이 설정이 off이거나 escape_string_warning이 on인 상태에서 일반 문자열('...') 안에 \n, \t 같은 이스케이프 시퀀스를 사용하면 경고 또는 에러가 발생합니다. 이 에러는 특히 PostgreSQL 9.1 이후 버전에서 standard_conforming_strings가 기본값으로 on으로 변경된 이후, 레거시 코드나 다른 DBMS에서 마이그레이션된 쿼리에서 자주 나타납니다.
주요 발생 원인
standard_conforming_strings설정과 이스케이프 시퀀스의 충돌
PostgreSQL 9.1 이전에는 standard_conforming_strings의 기본값이 off였기 때문에 백슬래시가 이스케이프 문자로 동작했습니다. 그러나 9.1 이후로는 기본값이 on으로 바뀌어, 일반 문자열 리터럴('...') 안의 \n, \t 등이 이스케이프 문자가 아닌 단순 문자 두 개로 처리됩니다. 이 상황에서 escape_string_warning이 활성화되어 있으면 22P06 경고가 발생하며, 일부 설정에서는 에러로 처리되기도 합니다.
- 레거시 애플리케이션 또는 ORM에서 생성된 비표준 쿼리
Oracle, MySQL 등 다른 DBMS에서 PostgreSQL로 마이그레이션된 코드나 일부 구식 ORM(Object-Relational Mapping) 라이브러리는 이스케이프 처리를 위해 단순 따옴표 문자열 안에 \를 삽입하는 방식을 사용합니다. 예를 들어 'Hello\nWorld'와 같이 작성된 쿼리가 PostgreSQL에서는 의도한 줄 바꿈이 아닌 두 개의 별개 문자(\와 n)로 해석되어 버립니다. 이런 쿼리가 escape_string_warning = on 환경에서 실행되면 22P06 에러가 트리거됩니다.
escape_string_warning및backslash_quote설정 미인지
개발자가 PostgreSQL의 문자열 관련 설정 파라미터들을 충분히 이해하지 못한 채로 쿼리를 작성하는 경우에도 이 에러가 자주 발생합니다. backslash_quote 파라미터가 safe_encoding이나 off로 설정되어 있을 때 \'를 사용하여 문자열 내 따옴표를 이스케이프하려 하면 보안 취약점과 함께 22P06 에러가 발생할 수 있습니다. 올바른 방법은 표준 SQL 방식인 따옴표 이중화('') 또는 E'' 이스케이프 문자열 구문을 사용하는 것입니다.
해결 방법
원인 1 해결: E'' 이스케이프 문자열 구문 사용
백슬래시 이스케이프가 반드시 필요한 경우, 일반 따옴표 문자열 대신 E 접두사를 붙인 이스케이프 문자열 구문을 사용하세요. 이 방식은 PostgreSQL에서 공식적으로 지원하는 명시적 이스케이프 방법입니다.
-- 잘못된 방식 (22P06 경고 발생 가능)
SELECT 'Hello\nWorld';
-- 올바른 방식: E'' 이스케이프 문자열 구문 사용
SELECT E'Hello\nWorld';
-- 탭 문자 사용 예시
SELECT E'Column1\tColumn2';
-- 실제 테이블 삽입 예시
INSERT INTO messages (content) VALUES (E'첫 번째 줄\n두 번째 줄');
-- 조회 시 이스케이프 시퀀스 확인
SELECT content, length(content) FROM messages WHERE content LIKE '%줄%';
원인 2 해결: 따옴표 이중화(Dollar Quoting) 또는 표준 SQL 방식 적용
레거시 코드에서 따옴표 이스케이프를 위해 \'를 사용하고 있다면, 표준 SQL 방식인 따옴표 이중화('')로 변경하거나 Dollar Quoting($$...$$)을 사용하세요.
-- 잘못된 방식: 백슬래시로 따옴표 이스케이프 (비표준)
SELECT 'It\'s a test'; -- 22P06 에러 발생 가능
-- 올바른 방식 1: 표준 SQL 따옴표 이중화
SELECT 'It''s a test';
-- 올바른 방식 2: Dollar Quoting 사용
SELECT $$It's a test$$;
-- 올바른 방식 3: E'' 구문 사용
SELECT E'It\'s a test';
-- 실제 업데이트 예시
UPDATE products
SET description = 'It''s a high-quality product'
WHERE product_id = 1;
-- Dollar Quoting을 활용한 함수 정의
CREATE OR REPLACE FUNCTION get_greeting(name TEXT)
RETURNS TEXT AS $$
BEGIN
RETURN 'Hello, ' || name || '! It''s nice to meet you.';
END;
$$ LANGUAGE plpgsql;
원인 3 해결: 설정 파라미터 확인 및 조정
현재 데이터베이스 또는 세션의 문자열 관련 설정을 확인하고 필요에 따라 조정하세요.
-- 현재 설정값 확인
SHOW standard_conforming_strings;
SHOW escape_string_warning;
SHOW backslash_quote;
-- 세션 레벨에서 설정 변경 (임시, 권장하지 않음)
SET escape_string_warning = off; -- 경고 비활성화 (근본 해결책 아님)
-- 표준 준수 문자열 확인
SET standard_conforming_strings = on; -- 권장 설정
-- postgresql.conf 에서 전역 설정 변경 (영구 적용)
-- escape_string_warning = on (기본값 유지 권장)
-- standard_conforming_strings = on (PostgreSQL 9.1+ 기본값)
-- backslash_quote 설정 확인 및 안전 설정
SHOW backslash_quote;
-- 권장값: safe_encoding (기본값)
-- 특수 문자 처리가 필요한 경우 올바른 방식
SELECT
E'탭:\t구분' AS tab_example,
E'줄바꿈:\n포함' AS newline_example,
E'백슬래시: \\' AS backslash_example;
-- chr() 함수를 사용한 특수 문자 삽입 (가장 안전한 방법)
SELECT 'Hello' || chr(10) || 'World' AS newline_example;
SELECT 'Column1' || chr(9) || 'Column2' AS tab_example;
마이그레이션 시 일괄 수정 방법
기존 쿼리를 일괄적으로 점검하고 수정해야 할 때는 다음과 같은 접근 방식을 사용하세요.
-- pg_stat_statements를 활용한 비표준 이스케이프 쿼리 탐지
SELECT query, calls, total_exec_time
FROM pg_stat_statements
WHERE query LIKE '%\\%' -- 백슬래시 포함 쿼리 탐지
ORDER BY calls DESC
LIMIT 20;
-- 데이터 내 백슬래시 처리 예시 (데이터 정제)
UPDATE legacy_table
SET text_column = replace(text_column, '\n', chr(10))
WHERE text_column LIKE '%\n%';
-- 함수를 이용한 안전한 문자열 변환
CREATE OR REPLACE FUNCTION safe_escape(input_text TEXT)
RETURNS TEXT AS $$
BEGIN
RETURN replace(replace(replace(input_text,
'\n', chr(10)),
'\t', chr(9)),
'\\', chr(92));
END;
$$ LANGUAGE plpgsql;
-- 사용 예시
SELECT safe_escape('Hello\nWorld\tTabbed');
예방 방법
- 코딩 표준에
E''구문 및 표준 SQL 이스케이프 명시화
팀 내 SQL 코딩 가이드라인에 이스케이프 문자 처리 표준을 명확히 정의하세요. 특수 문자가 포함된 문자열은 반드시 E'' 구문을 사용하거나 chr() 함수를 활용하도록 규칙을 정하고, 코드 리뷰 체크리스트에 “일반 따옴표 문자열 내 백슬래시 이스케이프 사용 여부 확인” 항목을 추가하는 것이 좋습니다. 또한 CI/CD 파이프라인에 pgTAP이나 sqlfluff 같은 SQL 린팅 도구를 통합하여 비표준 이스케이프 패턴을 자동으로 감지하도록 구성하면 더욱 효과적입니다.
standard_conforming_strings = on유지 및 애플리케이션 레벨 파라미터 바인딩 사용
postgresql.conf에서 standard_conforming_strings = on을 항상 유지하고, 애플리케이션 코드에서는 문자열을 직접 SQL에 삽입하는 방식 대신 반드시 파라미터 바인딩(Parameterized Query)을 사용하세요. 파라미터 바인딩을 사용하면 이스케이프 처리를 드라이버가 자동으로 처리하므로 22P06 에러뿐만 아니라 SQL 인젝션 공격까지 동시에 예방할 수 있습니다. 예를 들어 Python의 psycopg2, Java의 PreparedStatement, Node.js의 pg 라이브러리 등은 모두 파라미터 바인딩을 지원합니다.
관련 에러
- 22025 – invalid escape sequence: 이스케이프 시퀀스 자체가 잘못된 형식일 때 발생하는 에러로, 22P06과 함께 자주 나타납니다.
E''구문 내에서\q처럼 유효하지 않은 이스케이프 시퀀스를 사용할 때 트리거됩니다. - 22019 – invalid escape character:
LIKE또는SIMILAR TO연산자에서ESCAPE절에 잘못된 문자를 지정했을 때 발생합니다. - 42601 – syntax error: 이스케이프 처리 오류로 인해 문자열이 올바르게 종료되지 않을 경우 구문 에러로 이어질 수 있습니다.
- 22021 – character not in repertoire: 인코딩과 관련된 문자 처리 문제로, 이스케이프 처리 오류와 함께 발생할 수 있는 연관 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.