PostgreSQL 9.6.2 문서 | |||
---|---|---|---|
이전 | 위로 | 장 23. 로컬라이제이션 | 다음 |
PostgreSQL에서 지원하는 문자 집합을 사용하면 ISO 8859 같은 싱글바이트 문자 집합 및 EUC(Extended Unix Code), UTF-8, 뮬 내부코드 같은 멀티바이트 문자 집합을 비롯한 다양한 문자 집합으로 텍스트를 저장할 수 있다. 지원되는 모든 문자 집합은 클라이언트에서 사용 가능한 것이 확실하지만, 몇 가지는 서버 내에서의 사용이 지원되지 않는다(즉, 서버 측 인코딩). 기본 문자 집합은 initdb를 사용하여 PostgreSQL 데이터베이스 클러스터를 초기화하면서 선택된다. 오버라이드는 데이터베이스를 생성할 때 가능하므로 복수의 데이터베이스 각각 문자 집합이 서로 다를 수 있다.
하지만, 각 데이터베이스 문자 집합은 데이터베이스의 LC_CTYPE(문자 분류) 및 LC_COLLATE(string 정렬 순서) 로케일(locale) 설정과 호환되어야 한다는 중요한 제약이 있다. C 또는 POSIX 로케일(locale)의 경우 임의의 문자 집합이 허용되지만, 다른 로케일(locale)의 경우 올바로 작동되는 문자 집합은 하나밖에 없다. (그러나 Windows의 경우 UTF-8 인코딩은 모든 로케일(locale)에서 사용할 수 있다.)
표 23-1은 PostgreSQL에서 사용할 수 있는 문자 집합을 보여준다.
표 23-1. PostgreSQL 문자 집합
이름 | 설명 | 언어 | 서버? | 바이트/문자 | 별칭 |
---|---|---|---|---|---|
BIG5 | Big Five | 중국어 번체 | 아니요 | 1-2 | WIN950, Windows950 |
EUC_CN | Extended UNIX Code-CN | 중국어 간체 | 예 | 1-3 | |
EUC_JP | Extended UNIX Code-JP | 일본어 | 예 | 1-3 | |
EUC_JIS_2004 | Extended UNIX Code-JP, JIS X 0213 | 일본어 | 예 | 1-3 | |
EUC_KR | Extended UNIX Code-KR | 한국어 | 예 | 1-3 | |
EUC_TW | Extended UNIX Code-TW | 중국어 번체, 대만 | 예 | 1-3 | |
GB18030 | National Standard | 중국어 | 아니요 | 1-4 | |
GBK | Extended National Standard | 중국어 간체 | 아니요 | 1-2 | WIN936, Windows936 |
ISO_8859_5 | ISO 8859-5, ECMA 113 | 라틴어/키릴어 | 예 | 1 | |
ISO_8859_6 | ISO 8859-6, ECMA 114 | 라틴어/아랍어 | 예 | 1 | |
ISO_8859_7 | ISO 8859-7, ECMA 118 | 라틴어/그리스어 | 예 | 1 | |
ISO_8859_8 | ISO 8859-8, ECMA 121 | 라틴어/히브리어 | 예 | 1 | |
JOHAB | JOHAB | 한국어 (한글) | 아니요 | 1-3 | |
KOI8R | KOI8-R | 키릴어 (러시아어) | 예 | 1 | KOI8 |
KOI8U | KOI8-U | 키릴어 (우크라이나어) | 예 | 1 | |
LATIN1 | ISO 8859-1, ECMA 94 | 서유럽어 | 예 | 1 | ISO88591 |
LATIN2 | ISO 8859-2, ECMA 94 | 중유럽어 | 예 | 1 | ISO88592 |
LATIN3 | ISO 8859-3, ECMA 94 | 남유럽어 | 예 | 1 | ISO88593 |
LATIN4 | ISO 8859-4, ECMA 94 | 북유럽어 | 예 | 1 | ISO88594 |
LATIN5 | ISO 8859-9, ECMA 128 | 터키어 | 예 | 1 | ISO88599 |
LATIN6 | ISO 8859-10, ECMA 144 | 스칸디나비아어 | 예 | 1 | ISO885910 |
LATIN7 | ISO 8859-13 | 발트어 | 예 | 1 | ISO885913 |
LATIN8 | ISO 8859-14 | 켈트어 | 예 | 1 | ISO885914 |
LATIN9 | ISO 8859-15 | 유로 및 액센트 사용 LATIN1 | 예 | 1 | ISO885915 |
LATIN10 | ISO 8859-16, ASRO SR 14111 | 루마니아어 | 예 | 1 | ISO885916 |
MULE_INTERNAL | Mule 내부 코드 | Multilingual Emacs | 예 | 1-4 | |
SJIS | Shift JIS | 일본어 | 아니요 | 1-2 | Mskanji, ShiftJIS, WIN932, Windows932 |
SHIFT_JIS_2004 | Shift JIS, JIS X 0213 | 일본어 | 아니요 | 1-2 | |
SQL_ASCII | 미지정 (텍스트 참조) | 아무거나 | 예 | 1 | |
UHC | Unified Hangul Code | 한국어 | 아니요 | 1-2 | WIN949, Windows949 |
UTF8 | 유니코드, 8비트 | 모두 | 예 | 1-4 | Unicode |
WIN866 | Windows CP866 | 키릴어 | 예 | 1 | ALT |
WIN874 | Windows CP874 | 태국어 | 예 | 1 | |
WIN1250 | Windows CP1250 | 중유럽어 | 예 | 1 | |
WIN1251 | Windows CP1251 | 키릴어 | 예 | 1 | WIN |
WIN1252 | Windows CP1252 | 서유럽어 | 예 | 1 | |
WIN1253 | Windows CP1253 | 그리스어 | 예 | 1 | |
WIN1254 | Windows CP1254 | 터키어 | 예 | 1 | |
WIN1255 | Windows CP1255 | 히브리어 | 예 | 1 | |
WIN1256 | Windows CP1256 | 아랍어 | 예 | 1 | |
WIN1257 | Windows CP1257 | 발트어 | 예 | 1 | |
WIN1258 | Windows CP1258 | 베트남어 | 예 | 1 | ABC, TCVN, TCVN5712, VSCII |
모든 클라이언트 API가 나열된 모든 문자 집합을 지원하는 것은 아니다. 예를 들면, PostgreSQL JDBC 드라이버는 MULE_INTERNAL 및 LATIN6, LATIN8, LATIN10을 지원하지 않는다.
SQL_ASCII 설정은 다른 설정과 상당히 다르게 동작한다. 서버 문자 집합이 SQL_ASCII인 경우 서버는 ASCII 표준에 따라 바이트 값 0-127을 해석하고, 바이트 값 128-255은 해석 불가 문자로 처리한다. 설정이 SQL_ASCII인 경우 인코딩 변환이 완료되지 않는다. 따라서 이 설정은 사용 중인 특정 인코딩에 대한 선언이라기 보다는 인코딩에 대한 무시 선언이다. 대부분의 경우에, ASCII가 아닌 데이터를 사용하는 경우 PostgreSQL은 비 ASCII 문자를 변환하거나 검증할 수 없기 때문에 SQL_ASCII 설정을 사용하는 것은 현명하지 않다.
initdb는 PostgreSQL 클러스터에 대한 기본 문자 집합(인코딩)을 정의한다. 예를 들면,
initdb -E EUC_JP
이것은 기본 문자 집합을 EUC_JP (Extended Unix Code for Japanese)로 설정한다. 옵션 string이 긴 것을 선호하는 경우 --encoding을 -E 대신 사용할 수 있다. -E 또는 --encoding 옵션을 지정하지 않으면 initdb는 지정되었거나 기본 로케일(locale)을 기반으로 사용할 적정 인코딩을 결정하려고 한다.
인코딩이 선택한 로케일(locale)과 호환되는 경우 사용자는 기본값이 아닌 인코딩을 데이터베이스 생성 시에 지정할 수 있다.
createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
이것은 문자 집합 EUC_KR 및 로케일(locale) ko_KR을 사용하는 korean이라는 데이터베이스를 생성한다. 다른 방법으로 아래와 같은 SQL 명령을 사용할 수 있다.
CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
위의 명령은 template0 데이터베이스 복사를 지정한다는 점에 유의하라. 다른 데이터베이스를 복사할 때 데이터 손상의 우려 때문에 원본 데이터베이스로부터 인코딩과 로케일(locale) 설정은 변경할 수 없다. 자세한 내용은 22.3절을 참조 바란다.
데이터베이스의 인코딩은 시스템 카탈로그 pg_database에 저장되어 있다. psql -l 옵션 또는 \l 명령을 사용하면 이것을 확인할 수 있다.
$ psql -l List of databases Name | Owner | Encoding | Collation | Ctype | Access Privileges -----------+----------+-----------+-------------+-------------+------------------------------------- clocaledb | hlinnaka | SQL_ASCII | C | C | englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 | japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 | korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr | postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} (7 rows)
중요: 대부분의 최신 운영 체제에서 PostgreSQL은 LC_CTYPE 설정에 의해 어떤 문자 집합이 암시되는지를 판단하며, 강제로 일치되는 데이터베이스 인코딩만 사용되도록 한다. 예전 시스템에서는 선택한 로케일(locale)에서 예상되는 올바른 인코딩을 사용하는 것이 사용자의 책임이었다. 여기서 실수를 했을 경우 정렬 같이 로케일(locale)에 의존적인 작업은 이상하게 동작한다.
PostgreSQL은 LC_CTYPE이 C또는 POSIX가 아니더라도 수퍼유저가 SQL_ASCII 인코딩을 사용하여 데이터베이스를 생성하는 것을 가능하게 한다. 위에서 명시한 대로, SQL_ASCII는 데이터베이스에 저장된 데이터가 특정한 인코딩을 강제로 갖게 하지 않으므로 SQL_ASCII을 선택하면 로케일(locale)에 의존적인 동작은 잘못될 가능성이 있다. 이러한 설정 조합은 사용할 수 없으며 언젠가는 전면적으로 금지될 수 있다.
PostgreSQL은 서버와 클라이언트 간 특정 문자 집합 조합에 대해 자동 문자 집합 변환을 지원한다. 변환 정보는 pg_conversion 시스템 카탈로그에 저장된다. PostgreSQL은 표 23-2에 나오는 사전 정의된 변환 몇 가지를 제공한다. SQL 명령 CREATE CONVERSION을 사용하면 새로운 변환을 생성할 수 있다.
표 23-2. 클라이언트/서버 문자 집합 변환
서버 문자 집합 | 사용 가능한 클라이언트 문자 집합 |
---|---|
BIG5 | 서버 인코딩으로 지원되지 않음 |
EUC_CN | EUC_CN, MULE_INTERNAL, UTF8 |
EUC_JP | EUC_JP, MULE_INTERNAL, SJIS, UTF8 |
EUC_KR | EUC_KR, MULE_INTERNAL, UTF8 |
EUC_TW | EUC_TW, BIG5, MULE_INTERNAL, UTF8 |
GB18030 | 서버 인코딩으로 지원되지 않음 |
GBK | 서버 인코딩으로 지원되지 않음 |
ISO_8859_5 | ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866, WIN1251 |
ISO_8859_6 | ISO_8859_6, UTF8 |
ISO_8859_7 | ISO_8859_7, UTF8 |
ISO_8859_8 | ISO_8859_8, UTF8 |
JOHAB | JOHAB, UTF8 |
KOI8R | KOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251 |
KOI8U | KOI8U, UTF8 |
LATIN1 | LATIN1, MULE_INTERNAL, UTF8 |
LATIN2 | LATIN2, MULE_INTERNAL, UTF8, WIN1250 |
LATIN3 | LATIN3, MULE_INTERNAL, UTF8 |
LATIN4 | LATIN4, MULE_INTERNAL, UTF8 |
LATIN5 | LATIN5, UTF8 |
LATIN6 | LATIN6, UTF8 |
LATIN7 | LATIN7, UTF8 |
LATIN8 | LATIN8, UTF8 |
LATIN9 | LATIN9, UTF8 |
LATIN10 | LATIN10, UTF8 |
MULE_INTERNAL | MULE_INTERNAL, BIG5, EUC_CN, EUC_JP, EUC_KR, EUC_TW, ISO_8859_5, KOI8R, LATIN1 to LATIN4, SJIS, WIN866, WIN1250, WIN1251 |
SJIS | 서버 인코딩으로 지원되지 않음 |
SQL_ASCII | 아무거나(변환이 수행되지 않음) |
UHC | 서버 인코딩으로 지원되지 않음 |
UTF8 | 인코딩 모두 지원 |
WIN866 | WIN866, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN1251 |
WIN874 | WIN874, UTF8 |
WIN1250 | WIN1250, LATIN2, MULE_INTERNAL, UTF8 |
WIN1251 | WIN1251, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866 |
WIN1252 | WIN1252, UTF8 |
WIN1253 | WIN1253, UTF8 |
WIN1254 | WIN1254, UTF8 |
WIN1255 | WIN1255, UTF8 |
WIN1256 | WIN1256, UTF8 |
WIN1257 | WIN1257, UTF8 |
WIN1258 | WIN1258, UTF8 |
자동 문자 집합 변환을 활성화하려면 클라이언트에서 사용하려는 문자 집합(인코딩)을 PostgreSQL에 알려 주어야 한다. 이렇게 하는 방법에는 몇 가지가 있다.
psql에서 \encoding 명령 사용. \encoding을 사용하면 클라이언트 인코딩을 그때그때 변경할 수 있다. 예를 들면, 인코딩을 SJIS로 변경하려면 다음을 입력한다.
\encoding SJIS
libpq(32.10절)에는 클라이언트 인코딩을 제어하는 기능이 있다.
SET client_encoding TO 사용.
SET CLIENT_ENCODING TO 'value';
또는 표준 SQL 구문 SET NAMES을 사용할 수도 있다.
SET NAMES 'value';
현재 클라이언트 인코딩을 쿼리하려면,
SHOW client_encoding;
기본 인코딩을 리턴하려면,
RESET client_encoding;
PGCLIENTENCODING 사용. 환경 변수 PGCLIENTENCODING이 클라이언트의 환경에서 정의된 경우 해당 클라이언트 인코딩은 서버 연결 시 자동으로 선택된다. (위에 언급된 다른 방법을 사용하면 나중에 이것을 무시할 수 있다.)
환경 설정 변수 client_encoding 사용. client_encoding 변수가 설정된 경우 해당 클라이언트 인코딩은 서버 연결 시 자동으로 선택된다. (위에 언급된 다른 방법을 사용하면 나중에 이것을 무시할 수 있다.)
특정한 문자 변환이 불가능한 경우 사용자가 서버에 대해서는 EUC_JP를 선택하고 클라이언트에 대해서는 LATIN1을 선택한 것으로 추정되며, LATIN1 표현이 없는 일본어 문자가 리턴된다. 에러가 리포트된다.
클라이언트 문자 집합이 SQL_ASCII로 설정된 경우 서버의 문자 집합과 무관하게 인코딩 변환이 비활성화된다. 서버의 경우처럼 모든 ASCII 데이터를 사용하지 않을 때는 SQL_ASCII는 바람직하지 않다.
이 소스는 다양한 인코딩 시스템을 배우는 데 도움이 된다.
EUC_JP, EUC_CN, EUC_KR, EUC_TW에 대한 자세한 설명이 나와 있다.
유니코드 컨소시엄 웹사이트.
UTF-8 (8-bit UCS/Unicode Transformation Format)가 여기에 정의되어 있다.