새소식

DataBase/PostgreSQL

PostgreSQL - 한글 정렬

  • -

개요

PostgreSQL db로 프로젝트를 진행하던 중 한글 컬럼을 기준으로 정렬을 했더니 정렬이 이상하게 되는걸 발견했다. 이를 해결하는 방법을 정리해본다.

정렬이 이상하다..


방법 1 - pg_database 업데이트

첫 번째 방법은 데이터베이스의 collate 값을 업데이트하는 방식으로 간단하게 데이터베이스 전체에 로케일 변경이 가능하다.
이 방법은 시스템에 ko_KR.utf8 로케일이 미설치된 경우 실패하므로, 해당 로케일이 설치되어 있는지 확인(명령어: locale -a | grep ko_)해야한다.

select datname, datdba, encoding, datcollate, datctype from pg_database; -- 현재 데이터베이스 로케일 확인

UPDATE pg_database SET datcollate = 'ko_KR.utf8' WHERE datname = '데이터베이스명'; -- 로케일 변경

주의사항

  1. ko_KR.utf8을 새로 설치한 경우 데이터베이스에 바로 적용 가능한 것이 아닌 이후로 생성하는 데이터베이스에만 적용이 가능하다. 따라서 기존 데이터베이스에 적용을 하고 싶다면 기존 데이터를 백업하고 데이터베이스를 재생성하는 과정이 불가피하다.
  2. PostgreSQL에서 pg_database와 같은 시스템 카탈로그를 직접 수정하는 것은 공식적으로 권장하지 않는 방법이라고 한다.

방법 2 - ko_KR.utf8로 데이터베이스 생성

두 번째 방법은 데이터베이스 생성 시에 ko_KR.utf8로 데이터베이스를 생성하는 방법이다.
이 방법은 시스템에 ko_KR.utf8 로케일이 미설치된 경우 실패하므로, 해당 로케일이 설치되어 있는지 확인(명령어: locale -a | grep ko_)해야한다.

CREATE DATABASE 데이터베이스명
  LC_COLLATE 'ko_KR.utf8' -- 문자열 정렬 규칙을 지정
  LC_CTYPE 'ko_KR.utf8' -- 문자 분류(대소문자 구분, 문자 유형 등)를 지정
  TEMPLATE template0; -- 기본 템플릿이 아닌 template0을 사용함으로써, 데이터베이스 생성 시 기존의 로케일 설정이 영향을 주지 않도록

가능하다면 기존 데이터베이스를 백업한 후 해당 방법으로 데이터베이스를 재생성하는 것이 가장 바람직하다고 생각한다.


방법 3 - 컬럼에 COLLATE "ko-KR-x-icu" 설정

세 번째 방법은 테이블의 컬럼에 COLLATE "ko-KR-x-icu" 옵션을 설정하는 방식이다.

ko-KR-x-icu란?

ICU의 커스텀 국제화 규칙을 반영하는 ICU 라이브러리 전용 확장 로케일로 ko_KR.utf8과 큰 차이 없음

테이블 생성 시

CREATE TABLE example (
    name VARCHAR(100) COLLATE "ko-KR-x-icu"
);

테이블 수정 시

ALTER TABLE example
ALTER COLUMN name TYPE VARCHAR(255) COLLATE "ko-KR-x-icu" USING name::VARCHAR(255);

위와 같이 설정하면 복잡한 과정 없이 바로 한글 로케일 적용이 가능하다. 다만 개인적으로는 컬럼마다 일일히 설정하는 것이 임시방편에 불과하다고 생각해 2번 방법을 권장하고 싶다.


후기

이번에는 docker 컨테이너로 구성된 psql 서버라서 단순 한글 정렬로부터 파생된 추가 작업이 꼬리에 꼬리를 물고 이어지기 때문에 너무 귀찮아 임시방편으로 처리하게 되었지만 다음에 한글 정렬을 구현할 때는 데이터베이스 생성 시부터 ko_KR.utf8 로케일을 지정할 수 있도록 해야겠다.

 

어쨌든 완료!

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.