겪은 오류

[Oracle]java.sql.SQLException: 지원되지 않는 문자 집합(클래스 경로에 orai18n.jar 추가): KO16MSWIN949

Jude.R 2021. 2. 6. 03:48
반응형

어쩌다보니 여러 장비에서 프로젝트를 작업하게 됐는데 작업환경이 제각각이다 보니 이런저런 오류를 마주치게 된다

 

다른장비에서는 멀쩡하게 작동하던 코드가 특정 장비에만 오면 '지원되지 않는 문자 집합' 이라는 오류를 뱉어내서 뭐가 문제인가 했더니 데이터베이스의 문자셋이 다른 문제...

 

stackTrace에도 해결방법이 적혀있지만 orai18n 라는 라이브러리를 추가해주면 쉽게 해결되는것 같다.

 

Maven Repository: com.oracle.database.nls » orai18n

 

mvnrepository.com

 

근데 특정 pc에서만 발생하는 오류때문에 굳이 뭘 더 추가해주고싶진 않은 이상한 고집이 발동해서 뭐가 문제인지 찾아보기로 함.

 

일단 문자집합(character set) 문제라는걸 파악했으니 작동이 되는 PC와 안되는 PC의 db를 확인해 보기로 함

 

 

SELECT name, value$
FROM sys.props$
WHERE name='NLS_CHARACTERSET';

해당 쿼리를 사용하면 현재 DB가 어떤 캐릭터 셋을 적용하고있는지 확인할 수 있다.

먼저 코드가 멀쩡히 작동하는 PC의 캐릭터 셋은 ALAL32UTF8

그리고 해당 오류를 뱉어내는 PC의 캐릭터 셋은 KO16MSWIN949

 

후자의 캐릭터셋은 '한글', '윈도우' 의 언어설정이라서...좀더 글로벌하게 바꿔주고 싶다.

 

캐릭터셋을 바꾸는것도 쿼리 한줄이면 금방 끝나는데.... 이렇게 캐릭터셋을 바꾸는건 내 개인 PC인데다가 소규모 프로젝트니까 막 바꾸는거지 이미 서비스중이거나 덩치가 큰 프로젝트라면...어지간하면 바꾸지 않는게 좋을듯 싶다.

 

각설하고 캐릭터셋을 바꾸는 쿼리

UPDATE sys.props$
SET value$='AL32UTF8'
WHERE name = 'NLS_CHARACTERSET';

sysdba 계정으로 들어가서 해당 쿼리를 실행해주면 금방 바뀐다.

 

하지만 캐릭터셋을 바꾼다고 바로 적용되는것은 아니고 DB를 재실행해줘야한다.

그러니까 컴퓨터를 재부팅하거나 컴퓨터를 재부팅하기 싫다면 sqlplus를 이용해서 직접 db를 재시작해주자

 

>>SQL PLUS를 이용한 DB재시작

 

우선 PowerShell이나 cmd 를 이용해서 sqlplus sys as sysdba 명령어를 치고 sysdba권한을 가지고 DB에 접속

SQL > shutdown immediate

-- DB가 닫히고 언마운트 되기까지 시간이 좀 걸릴수 있으니 DB가 종료됐다는 안내문구가 뜰때까지 얌전히 기다리자

SQL > startup

 

데이터베이스가 열렸다는 안내문구가 뜨고나면 캐릭터셋 변경이 적용된걸 확인할수있다.

select 구문을 사용해서 기존 테이블의 데이터를 조회해보면 한글로 저장되어있던 데이터들이 전부 깨진걸 확인할수있다. 

반응형