본문 바로가기

Database

[Oracle] docker로 oracle 실행 후, DB 한글깨짐현상 해결

데이터를 AS-IS → TO-BE 로 이전하면서 가장 많이 발생하는 문제 중 하나가 데이터의 변경과 손실이다.

데이터 이관 후 조회했을 때 글자가 다 깨져서 알아볼 수 없는 상황이 발생하는 이유는

서로의 Character Set이 일치하지 않아서가 거의 대부분의 이유이다.

 

  • Character Set이란 데이터베이스 내부에 데이터가 저장될 때 참조되는 글자의 종류를 적어 놓은 일종의 사전이다.

사용자가 어떤 데이터를 Insert 하게 되면 Server Process가 Insert할 때 Character Set을 보고 글자를 확인하고 입력 해 주는 원리이다.

만약 사용자가 입력한 글자가 Character Set에 없는 글자라면 Server Process는 무슨 글자인지 몰라서 그냥 ?로 저장하게 된다.

 

이 Character Set은 처음 DB 설치 시, 환경세팅 때 설정하게 되는데 이 부분을 잘못 설정할 경우 데이터베이스를 다시 만들어야 할 수도 있으므로 주의해야 한다. 

 

select * from v$nls_parameters;

 

 

 

 

 

 

 

 

SQLPLUS SYSDBA 접속해야 한다. 그 과정을 살펴보자

노란색 부분에 자기 oracle 컨테이너ID 입력

 

 

sqlplus /nolog 입력

 

conn sys/oracle as sysdba 입력

 

 

update sys.props$ set value$='UTF8' WHERE name = 'UTF8';

 

Commit 해준다.

 

Characterset 변경 후에는 DB를 내렸다 올리는게 좋다

shutdown immdediate;

 

 

 

startup

 

 

참고) 이러고 바로 자신의 웹 어플리케이션이든 뭐든 한글깨짐현상을 확인하려 하면,

### Cause: java.sql.SQLRecoverableException: 소켓에서 읽을 데이터가 없습니다

이 에러가 날 수 있다. 

원인은 Connection 객체는 JVM에 살아 있고 실제 네트워크는 끊어져서 생기는 에러이다. (DB Shutdown 했었으니깐)

Connection Pool 사용할 때 abandon 설정이 소켓 timeout보다 크거나 커넥션 객체의 연결 유지 확인 설정이 되었는지 등을 확인해보자.