오라클에서의 한글 정렬

현재 사용하고 있는 케릭터 셋이 KO16MSWIN949일 때(조합형) 한글이 제대로 정렬되지 않는 문제가 있다. 이 경우 아래와 같이 함으로 써 해결 가능하다.
-- 한글이 제대로 정렬되어 나오지 않는다.
select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
  -- where rownum < 101
order by ch
;
-- 자음은 제대로 정렬됨
select ch
  from (
          select chr(ascii('ㄱ')+level-1) ch
          from dual
        connect by level <= ascii('ㅎ')-ascii('ㄱ')+1
       )
  -- where rownum < 101
order by ch
;

-- 모음도 제대로 정렬됨
select ch, ascii_code
  from (
          select chr(ascii('ㅏ')+level-1) ch
              , ascii('ㅏ')+level-1 ascii_code
          from dual
        connect by level <= ascii('ㅣ')-ascii('ㅏ')+1
       )
  -- where rownum < 101
order by ch
;

-- 현재 NLS_SORT  확인
show parameter nls_sort;

-- 정렬순서를 KO16KSC5601(완성형) 코드 순서대로 하겠다는 의미, 
-- 한글이 한자보다 먼저 나오고, 한자는 발음순서로 정렬된다.
alter session set nls_sort = 'KOREAN_M';

-- 이번엔 한글이 제대로 정렬되어 나온다.
select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
  -- where rownum < 101
order by ch
;

-- 이런방식을 사용해서도 가능하다.
select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
  -- where rownum < 101
order by NLSSORT(ch, 'NLS_SORT=KOREAN_M')
;

-- 유니코드 방식으로 정렬한다. 한자가 한글보다 먼저 나오며, 한자는 바이트 정렬되어 나온다
-- 한글은 제대로 정렬되어 나온다.
select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
  -- where rownum < 101
order by NLSSORT(ch, 'NLS_SORT=UNICODE_BINARY')
;

-- 한글의 비교연산자 시 한글이 제대로 연산되지 않는다.
select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
   where ch between '가' and '나'
order by NLSSORT(ch, 'NLS_SORT=UNICODE_BINARY')
;

-- 현재 비교 연산자의 파라미터값이 뭔지 확인한다.
-- BINARY( 기본값 ), ANSI
show parameter nls_comp

-- 파라미터 값을  ANSI 로 변경하고 비교연산을 하면 이번에는 제대로 연산된다.
alter session set nls_comp=ANSI;

select ch
  from (
          select chr(ascii('가')+level-1) ch
          from dual
        connect by level <= ascii('힝')-ascii('가')+1
       )
   where ch between '가' and '나'
order by NLSSORT(ch, 'NLS_SORT=UNICODE_BINARY')
;


참고 사이트 : http://www.dbguide.net/knowledge.db?cmd=view&boardUid=127008&boardConfigUid=20&categoryUid=205 http://www.dbguide.net/knowledge.db?cmd=view&boardUid=127023&boardConfigUid=20&categoryUid=205 http://www.dbguide.net/knowledge.db?cmd=view&boardUid=127024&boardConfigUid=20&categoryUid=205 http://www.dbguide.net/knowledge.db?cmd=view&boardUid=127046&boardConfigUid=20&categoryUid=205

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다