본문 바로가기
IT

ORA-00911 : 부적합한 문자 에러, 세미콜론이 범인?

by 샤나엘 2026. 4. 8.
반응형

ORA-00911 : 부적합한 문자 에러, 세미콜론이 범인?

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

ORA-00911


ORA-00911 에러란?

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

 

ORA-00911 에러란?

 

공식 메시지는 다음과 같습니다.

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이 발생합니다.

JDBC/프로그램에서 세미콜론 포함

 

 

에러 발생 예시 :

-- 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 복사

해결법 :

  1. 메모장(Notepad)에 먼저 붙여넣기 후 다시 복사 (서식 제거)
  2. Notepad++에서 "모든 문자 표시" 기능으로 숨은 문자 확인
  3. 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 에러 해결

반응형

댓글