[TIL] SQL 다국어 데이터 깨짐 현상 해결


SQL 다국어 데이터 깨짐 현상

현재 사용 중인 DB는 oracle이며, 이미 생성되어 있는 테이블에 다국어 데이터를 insert할 수도 있다고 들었다.

일단 현재 DB의 CHARACTERSET 속성을 봐야되는데 일단 조회해본다.

(현재 데이터셋은 CharacterSet K016MSWIN949 이였다.)

SELECT * FROM nls_database_parameters WHERE parameter LIKE ‘%CHARACTERSET%’;

ру́сский язы́к라는 러시아어 데이터를 insert 후 정상적으로 데이터가 적재되었는지 확인하였으나

실제 확인된 데이터는 ?(물음표)가 포함되어 있는 비정상적인 형태로

데이터의 깨짐 현상이 보였다.

원인 분석

참고로 중국어, 일어 등의 유니코드를 지원하지 않는 CharacterSet을 가진 DB에서

유니코드를 지원하기 위해 사용되는 CharacterSet으로 National CharacterSet 이 있다.

National CharacterSet 기반의 데이터 타입으로는 NCHAR, NVARCHAR2, NCLOB 이 있다.

작업 환경

중국어,일어 등의 유니코드를 지원하지 않는 CharacterSet K016MSWIN949를 사용

생성된 테이블 컬럼 데이터 타입은 NVARCHAR2

작업환경을 보았을 때 중국어, 일어 등의 유니코드를 지원하지 않는 CharacterSet 을 사용 중이었기에

데이터가 들어갈 컬럼의 데이터 타입을 NVARCHAR2로 생성하였으나

데이터 insert는 정상적으로 되지 않았음.

해결

National CharacterSet 기반의 데이터 타입 컬럼에 해당

데이터 타입으로 값을 insert 하기 위해서는 값 앞에 N을 붙여줘야한다.

이는 현재 값을 National CharacterSet 데이터 타입으로 작업하겠다는 의미이다.

예제) Insert into TABLE_NAME values (N’ру́сский язы́к’);

수행 쿼리 : select N’ру́сский язы́к’ from dual;

결과 : ру́сский язы́к