ORA-00911 : 부적합한 문자 에러, 세미콜론이 범인?
ORA-00911 : invalid character 에러는 SQL 문에 오라클이 인식하지 못하는 문자가 포함되었을 때 발생합니다. 가장 대표적인 원인은 세미콜론(;)인데, 상황에 따라 원인이 다릅니다. 이 글에서는 ORA-00911이 발생하는 모든 경우를 실전 기준으로 정리합니다.

ORA-00911 에러란?
ORA-00911은 SQL 문에 오라클 SQL 파서가 인식할 수 없는 문자가 포함되어 있을 때 발생하는 에러입니다.

공식 메시지는 다음과 같습니다.
ORA-00911 : invalid character
(문자가 부적합합니다)
이 에러에서 가장 혼란스러운 점은 세미콜론(;)입니다. SQL*Plus에서는 세미콜론이 문장 종결자로 필요하지만, JDBC나 애플리케이션 코드에서 SQL을 실행할 때는 세미콜론을 넣으면 에러가 발생합니다.
주요 발생 원인 5가지
| 번호 | 원인 | 설명 |
|---|---|---|
| 1 | JDBC/프로그램에서 세미콜론 포함 | Java, Python 등에서 SQL 끝에 ; 포함 |
| 2 | 전각 문자(한글 특수문자) 사용 | 전각 괄호, 전각 쉼표 등 |
| 3 | 보이지 않는 유니코드 문자 | 웹에서 복사한 SQL에 숨은 문자 |
| 4 | 백슬래시(\) 사용 | 오라클 SQL에서 이스케이프 문자로 인식 안 됨 |
| 5 | 잘못된 연산자/구분자 | != 대신 <>, 문자열 연결에 + 사용 등 |
원인 1 : JDBC/프로그램에서 세미콜론 포함
가장 흔한 원인입니다. Java JDBC, Python cx_Oracle, MyBatis 등에서 SQL 문자열 끝에 세미콜론(;)을 포함하면 ORA-00911이 발생합니다.

에러 발생 예시 :
-- Java JDBC
String sql = "SELECT * FROM employees WHERE department_id = 10;";
stmt.executeQuery(sql); // ORA-00911 발생!
-- Python
cursor.execute("SELECT * FROM employees;") // ORA-00911 발생!
-- MyBatis XML
<select id="getEmployees">
SELECT * FROM employees WHERE status = 'A';
</select>
-- 세미콜론 때문에 ORA-00911
해결법 :
-- 세미콜론 제거
String sql = "SELECT * FROM employees WHERE department_id = 10";
stmt.executeQuery(sql); // 정상
cursor.execute("SELECT * FROM employees") // 정상
-- MyBatis XML
<select id="getEmployees">
SELECT * FROM employees WHERE status = 'A'
</select>
SQLPlus, SQL Developer에서는 세미콜론이 문장 종결자 역할을 하지만, *프로그래밍 언어에서 SQL을 실행할 때는 세미콜론을 빼야** 합니다.
| 환경 | 세미콜론 |
|---|---|
| SQL*Plus / SQL Developer | 필요 (문장 종결자) |
| JDBC / cx_Oracle | 제거 (ORA-00911 발생) |
| MyBatis / iBatis | 제거 |
| Hibernate / JPA | 제거 |
| Spring JdbcTemplate | 제거 |
원인 2 : 전각 문자(한글 특수문자) 사용
한글 입력 상태에서 괄호, 쉼표, 따옴표 등을 입력하면 전각 문자가 들어가서 ORA-00911이 발생합니다.
에러 발생 예시 :
-- 전각 괄호 사용 (눈으로 구분 어려움)
SELECT * FROM employees WHERE department_id IN (10, 20);
-- ( )는 전각 괄호 → ORA-00911
-- 전각 쉼표
SELECT employee_id, first_name FROM employees;
-- ,는 전각 쉼표 → ORA-00911
-- 전각 작은따옴표
SELECT * FROM employees WHERE last_name = 'Smith';
-- ' '는 스마트 따옴표 → ORA-00911
해결법 :
SQL 작성 시 반드시 영문 입력 모드에서 특수문자를 입력하세요.
| 전각 (에러) | 반각 (정상) | 설명 |
|---|---|---|
| ( ) | ( ) | 괄호 |
| , | , | 쉼표 |
| ; | ; | 세미콜론 |
| ' ' | ' ' | 작은따옴표 |
| " " | " " | 큰따옴표 |
의심이 되면 SQL을 새로 타이핑하는 것이 가장 확실합니다.
원인 3 : 보이지 않는 유니코드 문자
웹 페이지, Word, PDF 등에서 SQL을 복사하면 Zero-Width Space, BOM, Non-Breaking Space 등 보이지 않는 문자가 포함될 수 있습니다.
에러 발생 상황 :
- 블로그나 Stack Overflow에서 SQL 복사
- 카카오톡, 슬랙에서 받은 SQL 붙여넣기
- Word 문서에서 SQL 복사
해결법 :
- 메모장(Notepad)에 먼저 붙여넣기 후 다시 복사 (서식 제거)
- Notepad++에서 "모든 문자 표시" 기능으로 숨은 문자 확인
- SQL을 처음부터 직접 타이핑
원인 4 : 백슬래시(\) 사용
MySQL에서는 백슬래시가 이스케이프 문자로 사용되지만, 오라클 SQL에서는 백슬래시가 일반 문자로 취급됩니다. 특정 컨텍스트에서 ORA-00911이 발생할 수 있습니다.
에러 발생 예시 :
-- 경로에 백슬래시 사용 시 주의
SELECT 'C:\Users\data\file.txt' FROM DUAL;
-- 오라클에서는 이스케이프 불필요
해결법 :
-- 오라클에서는 백슬래시를 그대로 사용
SELECT 'C:\Users\data\file.txt' FROM DUAL;
-- LIKE에서 이스케이프가 필요하면 ESCAPE 절 사용
SELECT * FROM files WHERE path LIKE '%_%' ESCAPE '';
원인 5 : 잘못된 연산자/구분자
다른 프로그래밍 언어의 연산자를 오라클 SQL에서 사용하면 ORA-00911이 발생합니다.

에러 발생 예시 :
-- 문자열 연결에 + 사용 (SQL Server 문법)
SELECT first_name + ' ' + last_name FROM employees;
-- ORA-00911
-- 같지 않음 연산자 != (일부 컨텍스트에서 문제)
-- 오라클에서는 != 도 지원하지만 <> 가 표준
해결법 :
-- 오라클 문자열 연결은 || 사용
SELECT first_name || ' ' || last_name FROM employees;
-- 같지 않음은 <> 사용 (표준)
SELECT * FROM employees WHERE department_id <> 10;
| 다른 언어/DBMS | 오라클 | 용도 |
|---|---|---|
| + | || | 문자열 연결 |
| != | <> (또는 !=) | 같지 않음 |
| && | AND | 논리 AND |
| || | OR (논리) / || (연결) | 문맥에 따라 |
자주 묻는 질문 (FAQ)
Q1. SQL*Plus에서는 되는데 Java에서 ORA-00911이 발생합니다.
SQL 끝의 세미콜론(;)을 제거하세요. SQL*Plus는 세미콜론이 문장 종결자이지만, JDBC에서는 불필요한 문자로 인식됩니다.
Q2. SQL이 눈으로 보기에 문제가 없는데 ORA-00911이 발생합니다.
전각 문자나 보이지 않는 유니코드 문자가 포함되었을 가능성이 높습니다. SQL을 처음부터 직접 타이핑해 보세요.
Q3. MyBatis에서 세미콜론을 넣어도 되는 경우가 있나요?
PL/SQL 블록(BEGIN-END)이나 프로시저 호출 시에는 세미콜론이 필요할 수 있습니다. 일반 SELECT/INSERT/UPDATE/DELETE에서는 제거하세요.
핵심 정리
| 점검 사항 | 확인 방법 |
|---|---|
| 세미콜론 | JDBC/MyBatis 등 프로그램에서 SQL 끝 세미콜론 제거 |
| 전각 문자 | 영문 입력 모드에서 특수문자 입력 |
| 숨은 문자 | 메모장 붙여넣기 후 재복사 또는 직접 타이핑 |
| 백슬래시 | 오라클에서는 이스케이프 불필요, ESCAPE 절 활용 |
| 연산자 | 문자열 연결은 +가 아닌 || 사용 |

태그 : ORA-00911, ORA-00911 해결, ORA-00911 원인, invalid character, 부적합한 문자, 오라클 에러, 오라클 세미콜론 에러, JDBC ORA-00911, MyBatis 세미콜론, 오라클 전각 문자, 오라클 유니코드, 오라클 문자열 연결, 오라클 트러블슈팅, 데이터베이스 에러, SQL 에러 해결
'IT' 카테고리의 다른 글
| ORA-00918 : 컬럼 정의가 애매합니다 - 조인할 때 꼭 알아야 할 것 (0) | 2026.04.08 |
|---|---|
| ORA-00917 : 쉼표 누락 에러, 원인은 쉼표만이 아니다 (0) | 2026.04.08 |
| ORA-00907 : 오른쪽 괄호 누락, 놓치기 쉬운 원인 총정리 (0) | 2026.04.08 |
| ORA-00904 : 부적합한 식별자, 이것만 확인하면 해결 (0) | 2026.04.08 |
| ORA-00903 : 테이블명이 부적합합니다 - 예약어부터 명명규칙까지 (0) | 2026.04.08 |
댓글