PostgreSQLの文字セットサポートにより、ISO 8859シリーズなどのシングルバイト文字やEUC(拡張Unixコード)、Unicode、Mule内部コードなどのマルチバイト文字を含む、各種文字セットでテキストを保存することができます。 すべての文字セットはサーバに対して透過的に使用することができます。 (他のソースからの拡張関数を使用している場合は、そのコードが正しく作成されているかどうかに依存します。) デフォルトの文字セットは、initdbを使用したPostgreSQLデータベースクラスタの初期化時に決定されます。 これは、createdb もしくは、CREATE DATABASE SQL コマンドを使用してデータベースを作成する時に上書きすることができます。 ですから、異なる文字セットを使用した複数のデータベースを持つことができます。
サーバで使用できる文字セットを表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) |
WIN | Windows CP1251 |
ALT | Windows CP866 |
WIN1256 | Windows CP1256 (Arabic) |
TCVN | TCVN-5712/Windows CP1258 (Vietnamese) |
WIN874 | Windows CP874 (Thai) |
重要項目: 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 をサポートしません。
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 となっていますが、7.4 での実際の結果にあわせてあります。)
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 |
WIN | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
ALT | ISO_8859_5, WIN, ALT, KOI8, UNICODE, MULE_INTERNAL |
WIN1256 | WIN1256, UNICODE |
TCVN | TCVN, UNICODE |
WIN874 | WIN874, 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 変数を使います。 postgresql.conf の client_encoding 変数が設定されていると、サーバとの接続が確立した時点で自動的にクライアントの符号化方式が選択されます。 (上で説明したそのほかのどんな方法でもその後書き換えできます。)
特定の文字の変換ができなかった場合、括弧で括った16進数で表したバイト値、例えば、(826C)、に変換されます。 サーバ用にEUC_JPを、クライアント用にLATIN1を選択したとすると、日本語の文字の中にはLATIN1に変換できないものがあります。
ここに記したものはさまざまな符号化方式システムを学習するためによい資料です。
3.2節に EUC_JP、EUC_CN、EUC_KR、EUC_TW の詳しい説明があります。
Unicode協会のWebサイトです。
ここで UTF-8 が定義されています。