2026년 06월 16일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00911 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00911 invalid character 는?
ORA-00911은 SQL 문장 내에 Oracle이 허용하지 않는 유효하지 않은 문자가 포함되어 있을 때 발생하는 에러입니다. 주로 SQL 문장의 끝에 세미콜론(;)을 잘못 포함하거나, 특수 문자를 잘못 사용하거나, 복사-붙여넣기 과정에서 보이지 않는 특수 문자가 삽입될 때 발생합니다. 이 에러는 초보자부터 숙련된 DBA까지 실무에서 매우 자주 마주치는 에러 중 하나이며, 원인을 정확히 파악하면 빠르게 해결할 수 있습니다.
주요 발생 원인
1. SQL 문장 끝에 세미콜론(;) 포함
JDBC, Python의 cx_Oracle, Java의 JDBC 드라이버 등 프로그래밍 언어에서 SQL을 실행할 때 문장 끝에 세미콜론(;)을 포함하면 ORA-00911 에러가 발생합니다. SQLPlus나 SQL Developer에서는 세미콜론이 SQL 문장의 종결자 역할을 하지만, 프로그램 코드에서 드라이버로 직접 SQL을 전달할 때는 세미콜론을 SQL 문장의 일부로 인식하기 때문에 유효하지 않은 문자 에러가 발생합니다. 특히 SQLPlus에서 잘 동작하던 SQL을 그대로 복사하여 애플리케이션 코드에 붙여넣을 때 자주 발생하는 실수입니다.
2. 보이지 않는 특수 문자 또는 비ASCII 문자 포함
워드 프로세서, 웹 브라우저, 이메일 클라이언트 등에서 SQL을 복사할 때 눈에 보이지 않는 유니코드 특수 문자(예: 줄 바꿈 문자 \u2028, 비표준 공백 문자 \u00A0, BOM 문자 등)가 SQL 문장 안에 포함될 수 있습니다. 이러한 문자들은 편집기 화면에서는 보이지 않지만 Oracle 파서는 이를 유효하지 않은 문자로 인식하여 ORA-00911을 발생시킵니다. 특히 웹 기반 에디터나 마크다운 도구에서 SQL을 작성하다가 코드에 붙여넣는 경우 이 문제가 자주 발생합니다.
3. 잘못된 특수 문자 사용 (따옴표, 괄호 등)
Oracle SQL에서 허용되지 않는 위치에 특수 문자를 사용하거나, 전각 따옴표(“”), 전각 괄호(()) 같은 유사 문자를 실수로 사용하는 경우에도 ORA-00911이 발생합니다. 예를 들어 일부 한국어 입력기 환경에서 영문 전환이 제대로 되지 않은 상태에서 SQL을 입력하면 전각 문자가 삽입될 수 있습니다. 또한 컬럼 별칭에 허용되지 않는 특수 문자를 사용하거나, 문자열 구분자를 잘못 사용하는 경우도 원인이 됩니다.
해결 방법
원인 1 해결: 세미콜론 제거
프로그래밍 언어(Java, Python, C# 등)에서 SQL을 실행할 때는 반드시 세미콜론을 제거해야 합니다.
잘못된 예시 (에러 발생):
-- JDBC 또는 cx_Oracle에서 아래와 같이 실행하면 ORA-00911 발생
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;
올바른 예시 (에러 해결):
-- 프로그램 코드에서 SQL 실행 시 세미콜론 제거
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10
Python cx_Oracle 예시:
-- Python 코드 내 SQL 문자열 (세미콜론 없이)
SELECT e.employee_id,
e.first_name,
d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > 5000
ORDER BY e.employee_id
단, PL/SQL 블록(BEGIN…END) 또는 여러 문장을 실행하는 경우는 예외적으로 세미콜론이 필요할 수 있으니 각 드라이버의 문서를 참고하시기 바랍니다.
원인 2 해결: 보이지 않는 특수 문자 제거
보이지 않는 특수 문자를 찾아내고 제거하려면 아래 방법을 사용합니다.
먼저 DUMP 함수로 의심스러운 컬럼이나 문자열 내부를 확인합니다:
-- 문자열의 ASCII 코드를 확인하여 비정상적인 문자 탐지
SELECT DUMP('확인할 문자열', 16) AS char_dump
FROM dual;
-- 보이지 않는 공백 문자 제거 예시 (TRIM + REGEXP_REPLACE 활용)
SELECT REGEXP_REPLACE(
TRIM(sql_column),
'[^[:print:]]', -- 출력 불가 문자 모두 제거
''
) AS clean_sql
FROM your_table;
SQL 문장 자체를 정제하는 방법:
-- 비ASCII 문자를 제거하는 정규식 활용
SELECT REGEXP_REPLACE(
:sql_text,
'[^\x00-\x7F]', -- ASCII 범위 밖의 문자 제거
''
) AS sanitized_sql
FROM dual;
텍스트 에디터(VSCode, Notepad++ 등)에서 SQL을 작성할 때는 항상 UTF-8(BOM 없음) 인코딩으로 저장하고, 붙여넣기 후 반드시 순수 텍스트 붙여넣기(Ctrl+Shift+V)를 사용하는 것을 권장합니다.
원인 3 해결: 잘못된 특수 문자 수정
전각 문자 및 잘못된 특수 문자를 올바른 반각 문자로 교체해야 합니다.
잘못된 예시 (전각 따옴표 사용 – 에러 발생):
-- 전각 따옴표 사용으로 ORA-00911 발생
SELECT employee_id AS "사번",first_name AS "이름"
FROM employees;
올바른 예시 (반각 문자 사용):
-- 올바른 반각 따옴표와 쉼표 사용
SELECT employee_id AS "사번", first_name AS "이름"
FROM employees;
컬럼 별칭에 특수 문자가 반드시 필요한 경우:
-- 허용되는 별칭 형식
SELECT
employee_id AS emp_id,
first_name AS "First Name", -- 공백 포함 시 큰따옴표 사용
hire_date AS "입사일자",
salary * 12 AS annual_salary
FROM employees
WHERE ROWNUM <= 10;
예방 방법
1. SQL 린터 및 코드 리뷰 프로세스 도입
SQLFluff, SQL Developer의 문법 검사 기능, 또는 사내 코드 리뷰 프로세스를 통해 SQL이 실제 데이터베이스에 전달되기 전에 문법 오류와 유효하지 않은 문자를 자동으로 검출하는 체계를 마련하세요. CI/CD 파이프라인에 SQL 린터를 통합하면 배포 전에 이런 문제를 사전에 차단할 수 있습니다. 특히 애플리케이션 코드의 SQL 문자열은 반드시 순수 ASCII 문자만 사용하도록 팀 내 코딩 컨벤션을 정립하는 것이 중요합니다.
2. SQL 문자열 처리 유틸리티 함수 표준화
애플리케이션 레이어에서 Oracle에 SQL을 전달하기 전에 세미콜론 제거, 비ASCII 문자 제거, 공백 정규화 등을 자동으로 처리하는 공통 유틸리티 함수를 만들어 팀 전체가 공유하세요. 이를 통해 개발자가 실수로 세미콜론을 포함하거나 특수 문자를 삽입하는 상황을 미연에 방지할 수 있습니다. 아래는 참고할 수 있는 SQL 정제 로직의 개념 예시입니다:
-- SQL 문자열 정제를 위한 함수 예시 (Oracle PL/SQL)
CREATE OR REPLACE FUNCTION sanitize_sql_string(
p_sql IN VARCHAR2
) RETURN VARCHAR2
IS
v_result VARCHAR2(32767);
BEGIN
-- 앞뒤 공백 제거
v_result := TRIM(p_sql);
-- 끝의 세미콜론 제거
IF SUBSTR(v_result, -1) = ';' THEN
v_result := SUBSTR(v_result, 1, LENGTH(v_result) - 1);
END IF;
-- 출력 불가 문자 제거 (탭, 개행 제외)
v_result := REGEXP_REPLACE(
v_result,
'[^\t\n\r\x20-\x7E]',
''
);
RETURN v_result;
END sanitize_sql_string;
/
-- 함수 테스트
SELECT sanitize_sql_string('SELECT * FROM employees;') AS result
FROM dual;
관련 에러
- ORA-00900: Invalid SQL statement — SQL 문장 전체 구조가 Oracle이 인식할 수 없는 형태일 때 발생하며, ORA-00911과 유사한 상황에서 함께 나타나는 경우가 있습니다.
- ORA-00907: Missing right parenthesis — 괄호 불일치로 인해 발생하며, 특수 문자 오용과 복합적으로 발생하기도 합니다.
- ORA-01756: Quoted string not properly terminated — 따옴표가 올바르게 닫히지 않았을 때 발생하며, 잘못된 인용 부호 사용 시 ORA-00911과 함께 나타날 수 있습니다.
- ORA-00936: Missing expression — SQL 구문에서 필수 표현식이 누락되었을 때 발생하며, 특수 문자로 인한 파싱 오류와 연관되어 나타나기도 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.