文字セットサポート

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 20章多言語対応 | 早送り | 次のページ

# 20.2. 文字セットサポート

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

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

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

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

名前 | 説明
--- | ---
`SQL_ASCII` | ASCII
`EUC_JP` | 日本語EUC
`EUC_CN` | 中国語 EUC
`EUC_KR` | 韓国語 EUC
`JOHAB` | (ハングルベースの)韓国語 EUC
`EUC_TW` | 台湾語 EUC
`UNICODE` | Unicode (UTF-8)
`MULE_INTERNAL` | Mule 内部コード
`LATIN1` | ISO 8859-1/ECMA 94 (Latin alphabet no.1)
`LATIN2` | ISO 8859-2/ECMA 94 (Latin alphabet no.2)
`LATIN3` | ISO 8859-3/ECMA 94 (Latin alphabet no.3)
`LATIN4` | ISO 8859-4/ECMA 94 (Latin alphabet no.4)
`LATIN5` | ISO 8859-9/ECMA 128 (Latin alphabet no.5)
`LATIN6` | ISO 8859-10/ECMA 144 (Latin alphabet no.6)
`LATIN7` | ISO 8859-13 (Latin alphabet no.7)
`LATIN8` | ISO 8859-14 (Latin alphabet no.8)
`LATIN9` | ISO 8859-15 (Latin alphabet no.9)
`LATIN10` | ISO 8859-16/ASRO SR 14111 (Latin alphabet no.10)
`ISO_8859_5` | ISO 8859-5/ECMA 113 (Latin/Cyrillic)
`ISO_8859_6` | ISO 8859-6/ECMA 114 (Latin/Arabic)
`ISO_8859_7` | ISO 8859-7/ECMA 118 (Latin/Greek)
`ISO_8859_8` | ISO 8859-8/ECMA 121 (Latin/Hebrew)
`KOI8` | KOI8-R(U)
`ALT` | Windows CP866
`WIN874` | Windows CP874 (Thai)
`WIN1250` | Windows CP1250
`WIN` | Windows CP1251
`WIN1256` | Windows CP1256 (Arabic)
`TCVN` | TCVN-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_INTERNAL`、`LATIN6`、`LATIN8`、そして `LATIN10` をサポートしません。

## 20.2.2. 文字セットの設定

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

    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_ASCII` | `SQL_ASCII`, `UNICODE`, `MULE_INTERNAL`
`EUC_JP` | `EUC_JP`, `SJIS`, `UNICODE`, `MULE_INTERNAL`
`EUC_CN` | `EUC_CN`, `UNICODE`, `MULE_INTERNAL`
`EUC_KR` | `EUC_KR`, `UNICODE`, `MULE_INTERNAL`
`JOHAB` | `JOHAB`, `UNICODE`
`EUC_TW` | `EUC_TW`, `BIG5`, `UNICODE`, `MULE_INTERNAL`
`LATIN1` | `LATIN1`, `UNICODE` `MULE_INTERNAL`
`LATIN2` | `LATIN2`, `WIN1250`, `UNICODE`, `MULE_INTERNAL`
`LATIN3` | `LATIN3`, `UNICODE`, `MULE_INTERNAL`
`LATIN4` | `LATIN4`, `UNICODE`, `MULE_INTERNAL`
`LATIN5` | `LATIN5`, `UNICODE`
`LATIN6` | `LATIN6`, `UNICODE`, `MULE_INTERNAL`
`LATIN7` | `LATIN7`, `UNICODE`, `MULE_INTERNAL`
`LATIN8` | `LATIN8`, `UNICODE`, `MULE_INTERNAL`
`LATIN9` | `LATIN9`, `UNICODE`, `MULE_INTERNAL`
`LATIN10` | `LATIN10`, `UNICODE`, `MULE_INTERNAL`
`ISO_8859_5` | `ISO_8859_5`, `UNICODE`, `MULE_INTERNAL`, `WIN`, `ALT`, `KOI8`
`ISO_8859_6` | `ISO_8859_6`, `UNICODE`
`ISO_8859_7` | `ISO_8859_7`, `UNICODE`
`ISO_8859_8` | `ISO_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_INTERNAL` | `EUC_JP`, `SJIS`, `EUC_KR`, `EUC_CN`, `EUC_TW`, `BIG5`, `LATIN1` to `LATIN5`, `WIN`, `ALT`, `WIN1250`, `BIG5`, `ISO_8859_5`, `KOI8`
`KOI8` | `ISO_8859_5`, `WIN`, `ALT`, `KOI8`, `UNICODE`, `MULE_INTERNAL`
`ALT` | `ISO_8859_5`, `WIN`, `ALT`, `KOI8`, `UNICODE`, `MULE_INTERNAL`
`WIN874` | `WIN874`, `UNICODE`
`WIN1250` | `LATIN2`, `WIN1250`, `UNICODE`, `MULE_INTERNAL`
`WIN` | `ISO_8859_5`, `WIN`, `ALT`, `KOI8`, `UNICODE`, `MULE_INTERNAL`
`WIN1256` | `WIN1256`, `UNICODE`
`TCVN` | `TCVN`, `UNICODE`

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

- psql で `\encoding` コマンドを使います。 `\encoding` は実行中であってもクライアントの符号化方式を変更させることができます。 例えば符号化方式を `SJIS` に変えたい場合は次のように入力します。

      \encoding SJIS

- libpq 関数を使います。 `\encoding` は結果を得るために実際は `PQsetClientEncoding()` を呼び出しています。

      int PQsetClientEncoding(PGconn *conn, const char *encoding);

  ここで `conn` はサーバへの接続、`encoding` は使用したい符号化方式です。 この関数は符号化方式の設定に成功すると 0 を返し、失敗すると -1 を返します。 この接続に対する現在の符号化方式は次のようにして確認できます。

      int PQclientEncoding(const PGconn *conn);

  `EUC_JP` のような記号文字列ではなく符号化方式 ID を返すことに注意して下さい。 符号化方式 ID を符号化方式名に変換するには次のようにします。

      char *pg_encoding_to_char(int encoding_id);

- `SET client_encoding TO` を使います。 次の SQL コマンドでクライアントの符号化方式を設定できます。

      SET CLIENT_ENCODING TO 'value';

  標準SQLの構文 `SET NAMES` を同じ目的で使うこともできます。

      SET NAMES 'value';

  現在のクライアントの符号化方式を問い合わせるには次のようにします。

      SHOW client_encoding;

  デフォルトの符号化方式に戻すのには次のようにします。

      RESET client_encoding;

- `PGCLIENTENCODING` を使います。 クライアントの環境で`PGCLIENTENCODING`環境変数が定義されていると、サーバと接続が確立した時点で自動的にクライアントの符号化方式が選択されます。 (上で説明したその他のどんな方法でもその後書き換えできます。)

- client_encoding 変数を使います。 `client_encoding` 変数が設定されていると、サーバとの接続が確立した時点で自動的にクライアントの符号化方式が選択されます。 (上で説明したそのほかのどんな方法でもその後書き換えできます。)

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

## 20.2.4. 推奨文書

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

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

  3.2節に `EUC_JP`、`EUC_CN`、`EUC_KR`、`EUC_TW` の詳しい説明があります。

http://www.unicode.org/

  Unicode協会のWebサイトです。

RFC 2044

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

前のページ | ホーム | 次のページ
多言語対応 | 上に戻る | 定常的なデータベース保守作業