他のバージョンの文書9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

20.2. 文字セットサポート

PostgreSQLの文字セットサポートにより、ISO 8859シリーズなどのシングルバイト文字やEUC(拡張Unixコード)、Unicode、Mule内部コードなどのマルチバイト文字を含む、各種文字セットでテキストを保存することができます。 すべての文字セットはサーバに対して透過的に使用することができます。 (他のソースからの拡張関数を使用している場合は、そのコードが正しく作成されているかどうかに依存します。) デフォルトの文字セットは、initdbを使用したPostgreSQLデータベースクラスタの初期化時に決定されます。 これは、createdb もしくは、CREATE DATABASE SQL コマンドを使用してデータベースを作成する時に上書きすることができます。 ですから、異なる文字セットを使用した複数のデータベースを持つことができます。

20.2.1. サポートされる文字セット

サーバで使用できる文字セットを表20-1に示します。

表 20-1. サーバ文字セット

名前説明
SQL_ASCIIASCII
EUC_JP日本語EUC
EUC_CN中国語 EUC
EUC_KR韓国語 EUC
JOHAB(ハングルベースの)韓国語 EUC
EUC_TW台湾語 EUC
UNICODEUnicode (UTF-8)
MULE_INTERNALMule 内部コード
LATIN1ISO 8859-1/ECMA 94 (Latin alphabet no.1)
LATIN2ISO 8859-2/ECMA 94 (Latin alphabet no.2)
LATIN3ISO 8859-3/ECMA 94 (Latin alphabet no.3)
LATIN4ISO 8859-4/ECMA 94 (Latin alphabet no.4)
LATIN5ISO 8859-9/ECMA 128 (Latin alphabet no.5)
LATIN6ISO 8859-10/ECMA 144 (Latin alphabet no.6)
LATIN7ISO 8859-13 (Latin alphabet no.7)
LATIN8ISO 8859-14 (Latin alphabet no.8)
LATIN9ISO 8859-15 (Latin alphabet no.9)
LATIN10ISO 8859-16/ASRO SR 14111 (Latin alphabet no.10)
ISO_8859_5ISO 8859-5/ECMA 113 (Latin/Cyrillic)
ISO_8859_6ISO 8859-6/ECMA 114 (Latin/Arabic)
ISO_8859_7ISO 8859-7/ECMA 118 (Latin/Greek)
ISO_8859_8ISO 8859-8/ECMA 121 (Latin/Hebrew)
KOI8KOI8-R(U)
ALTWindows CP866
WIN874Windows CP874 (Thai)
WIN1250Windows CP1250
WINWindows CP1251
WIN1256Windows CP1256 (Arabic)
TCVNTCVN-5712/Windows CP1258 (Vietnamese)

重要項目: PostgreSQL 7.2 以前は LATIN5 が間違って ISO 8859-5 を意味していました。 7.2からLATIN5 は ISO 8859-9 です。 7.1 もしくはそれ以前で作成された LATIN5 によるデータベースをお持ちで 7.2 に移行したい場合はこの変更に特に気を配ってください。

すべての API が上に一覧表とした文字セットをサポートしているわけではありません。 例えば PostgreSQL JDBC ドライバは MULE_INTERNALLATIN6LATIN8、そして LATIN10 をサポートしません。

20.2.2. 文字セットの設定

initdbPostgreSQL クラスタのデフォルト文字セットを定義します。 以下に例を示します。

initdb -E EUC_JP

これはデフォルトの文字セット(符号化方式)を EUC_JP (日本語拡張 Unix コード) に設定します。 より長いオプションの文字列を入力するのがお好みなら -E の代わりに --encoding と書くこともできます。 -E オプションも --encoding オプションも与えられない場合、SQL_ASCIIが使われます。

異なる文字セットのデータベースを作成することができます。

createdb -E EUC_KR korean

これは EUC_KR 文字セットで korean という名前のデータベースを作成します。 SQLコマンドで同じことを行うには次のようにします。

CREATE DATABASE korean WITH ENCODING 'EUC_KR';

データベースの符号化方式は pg_database システムカタログに格納されます。 psql-lオプションか\lコマンドで符号化方式を確認することができます。

$ psql -l
            List of databases
   Name        |  Owner  |   Encoding    
---------------+---------+---------------
 euc_cn        | t-ishii | EUC_CN
 euc_jp        | t-ishii | EUC_JP
 euc_kr        | t-ishii | EUC_KR
 euc_tw        | t-ishii | EUC_TW
 mule_internal | t-ishii | MULE_INTERNAL
 regression    | t-ishii | SQL_ASCII
 template1     | t-ishii | EUC_JP
 test          | t-ishii | EUC_JP
 unicode       | t-ishii | UNICODE
(9 rows)

(訳注:オリジナルは Name 列 が Database となっていますが、8.0.0rc2での実際の結果にあわせてあります。)

重要項目: データベースに対して好みの符号化方式を任意に指定することができますが、選択したロケールが想定していない符号化方式を選択することはお勧めしません。 LC_COLLATE設定とLC_CTYPE設定は、暗黙的な特定の符号化方式を意味していますので、互換性のない符号化方式でロケールに依存した操作(ソート処理など)を行うと、データを間違って解釈してしまいます。

これらのロケール設定はinitdbで固定化されます。 1つのクラスタにおいて、異なるデータベースに異なる符号化方式を使用できるという、この見かけ上の柔軟性は現実的ではなく、理論に走ったものといえます。 将来のバージョンのPostgreSQLで、これらの機構を変更する予定です。

安全に複数の符号化方式を使用する方法の1つとして、initdb時にロケールをCもしくはPOSIXに設定する方法があります。 これにより、ロケールを意識する必要が全くなくなります。

20.2.3. サーバ・クライアント間の自動文字セット変換

PostgreSQL には特定の文字セットに対してサーバとクライアントの間で自動的に文字セットを変換する機能を提供しています。 変換情報は pg_conversion システムカタログに格納されています。 新しい変換を作成するには CREATE CONVERSION を使用します。 PostgreSQL には定義済みの変換がいくつか用意されています。 表20-2に定義済みの変換を示します。

表 20-2. クライアント・サーバ文字セット変換

サーバ文字セット利用可能なクライアント文字セット
SQL_ASCIISQL_ASCII, UNICODE, MULE_INTERNAL
EUC_JPEUC_JP, SJIS, UNICODE, MULE_INTERNAL
EUC_CNEUC_CN, UNICODE, MULE_INTERNAL
EUC_KREUC_KR, UNICODE, MULE_INTERNAL
JOHABJOHAB, UNICODE
EUC_TWEUC_TW, BIG5, UNICODE, MULE_INTERNAL
LATIN1LATIN1, UNICODE MULE_INTERNAL
LATIN2LATIN2, WIN1250, UNICODE, MULE_INTERNAL
LATIN3LATIN3, UNICODE, MULE_INTERNAL
LATIN4LATIN4, UNICODE, MULE_INTERNAL
LATIN5LATIN5, UNICODE
LATIN6LATIN6, UNICODE, MULE_INTERNAL
LATIN7LATIN7, UNICODE, MULE_INTERNAL
LATIN8LATIN8, UNICODE, MULE_INTERNAL
LATIN9LATIN9, UNICODE, MULE_INTERNAL
LATIN10LATIN10, UNICODE, MULE_INTERNAL
ISO_8859_5ISO_8859_5, UNICODE, MULE_INTERNAL, WIN, ALT, KOI8
ISO_8859_6ISO_8859_6, UNICODE
ISO_8859_7ISO_8859_7, UNICODE
ISO_8859_8ISO_8859_8, UNICODE
UNICODE EUC_JP, SJIS, EUC_KR, UHC, JOHAB, EUC_CN, GBK, EUC_TW, BIG5, LATIN1 to LATIN10, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, WIN, ALT, KOI8, WIN1256, TCVN, WIN874, GB18030, WIN1250
MULE_INTERNALEUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250, BIG5, ISO_8859_5, KOI8
KOI8ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
ALTISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WIN874WIN874, UNICODE
WIN1250LATIN2, WIN1250, UNICODE, MULE_INTERNAL
WINISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL
WIN1256WIN1256, UNICODE
TCVNTCVN, UNICODE

自動文字セット変換を有効にするためには、クライアントでどのような文字セット(符号化方式)を使用させたいかを PostgreSQL に伝えなければなりません。 これを行うにはいくつかの方法があります。

特定の文字の変換ができなかった場合、括弧で括った16進数で表したバイト値、例えば、(826C)、に変換されます。 サーバ用にEUC_JPを、クライアント用にLATIN1を選択したとすると、日本語の文字の中にはLATIN1に変換できないものがあります。

20.2.4. 推奨文書

ここに記したものはさまざまな符号化方式システムを学習するためによい資料です。

ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

3.2節に EUC_JPEUC_CNEUC_KREUC_TW の詳しい説明があります。

http://www.unicode.org/

Unicode協会のWebサイトです。

RFC 2044

ここで UTF-8 が定義されています。