-
PostgreSQL collate 한글 컬럼 정렬Database 2023. 4. 4. 22:19
한글 이름을 오름차순으로 조회하는 요구사항이 있었다.
쿼리가 아닌 DBeaver 와 같은 SQL 클라이언트에서 편집기로 정렬했을 때는 기대한 바와 같았는데 쿼리 결과는 기댓값과 달랐다.
여러 번 조회하고 규칙을 보니까 2글자의 이름이 먼저 뽑혔다.
GCP의 SQL을 사용하고 있는데 먼저 default collate 를 조회해 봤다.
SHOW lc_collate; /* en_US.UTF8 */
지금은 이름 컬럼의 정렬만 한국어로 정렬되면 돼서 이름 컬럼의 collate 를 변경해 보자.
ex. 테이블명은 profile, 컬럼은 text 타입의 name
ALTER TABLE profile ALTER COLUMN name SET DATA TYPE text COLLATE "ko_KR.utf8";
이렇게 name 컬럼의 collate 를 변경하고 SQL 편집기 또는 psql 에서 `\d profile` 을 통해 컬럼의 collate 정보를 확인한 후 다시 쿼리를 실행하니 기대한 바와 같이 동작하였다.
참고:
1. lc_collate 의 네이밍 규칙 language_territory.codeset
ex. ko_KR.utf8
2. collate 종류 조회
select collname from pg_collation
3. typeorm 을 사용하고 있어 synchronize 기능을 사용하였는데 collate 는 변경되지 않는다.
// ... @Column({ type: 'text', collation: 'ko_KR.utf8', }) name?: string;
나중에 비슷한 문제가 생기면 찾아올지도...
정말로 다시 비슷한 문제가 생겨서 찾아왔다.
23년 07월 22일 추가 작성:
로컬에서 collation 변경할 때 collation 이 존재하지 않는다고 해서 잉 뭐지 했는데
GCP SQL 에서는 collation name 이 `ko_KR.utf8` 인데 정확한 네이밍은 `ko_KR.UTF-8`이 맞음.
GCP SQL 에서 "ko_KR.UTF-8" 생성해서 사용하는걸로 했다.
CREATE COLLATION "ko_KR.UTF-8" from "ko_KR.utf8" ALTER TABLE "artist_profile" ALTER COLUMN "name" TYPE text COLLATE "ko_KR.UTF-8"
https://www.postgresql.org/docs/current/collation.html
'Database' 카테고리의 다른 글
공동주택 공시가격 DB 저장하기 (2) 2024.02.15 mysql whitespace to null (0) 2024.02.14 MySQL wait_timeout (0) 2023.10.27 PostgreSQL Index (2) 2023.02.26 JOIN (0) 2020.07.28