著者: 石井 達夫 (<ishii@postgresql.org>)、最終更新日 2000-03-22。より詳しくは 石井達夫のweb サイト を参照して下さい。
マルチバイト(MB)サポートは PostgreSQL で EUC(拡張 Unix コード)、Unicode、および Mule 内部コードなどのマルチバイト文字セットを扱えるように意図されたものです。 MBが使えると、正規表現(regexp)、LIKE、いくつかの関数でマルチバイト文字セットが使えます。initdb を使って PostgreSQL インストレーションを初期化する際にデフォルトの符号化システムが選択されます。この設定は createdb または SQL の CREATE DATABASE コマンドでデータベースを作成する際に上書きすることができます。したがって、データベースごとに異なった符号化システムによる複数のデータベースを持つことができます。
マルチバイトオプションを付けて configure を実行します。
./configure --enable-multibyte[=encoding_system]
ここで encoding_system は以下の表にある値のうちのひとつです。
Table 5-1. 文字セット符号化方式
符号化 | 説明 |
---|---|
SQL_ASCII | ASCII |
EUC_JP | 日本語 EUC |
EUC_CN | 中国語 EUC |
EUC_KR | ハングル 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 | ECMA-113 Latin/Cyrillic |
ISO-8859-6 | ECMA-114 Latin/Arabic |
ISO-8859-7 | ECMA-118 Latin/Greek |
ISO-8859-8 | ECMA-121 Latin/Hebrew |
KOI8 | KOI8-R(U) |
WIN | Windows CP1251 |
ALT | Windows CP866 |
Important: PostgreSQL 7.2 以前は LATIN5 が間違ってISO 8859-5 を意味していました。 LATIN5 は ISO 8859-9 です。7.1 もしくはそれ以前で作成された LATIN5 によるデータベースをお持ちで 7.2 に移植したい場合はこの変更に特に気を配ってください。
Important: すべての API が上に一覧表とした符号化をサポートしているわけではありません。例えば PostgreSQL JDBC ドライバは MULE_INTERNAL、 LATIN6、LATIN8、そして LATIN10 をサポートしません。
デフォルトで PostgreSQL が日本語符号化方式を使用できるようにコンフィギュレーションする例です:
$ ./configure --enable-multibyte=EUC_JP
もし符号化システムが省略された場合 (./configure --enable-multibyte)、 SQL_ASCII が使用されます。
initdb で PostgreSQL のひとつのインストレーションのデフォルトの符号化方式を定義します。例です。
$ initdb -E EUC_JP
はデフォルトの符号化方式を EUC_JP (日本語拡張 Unix コード)に設定します。より長いオプションの文字列を入力するのがお好みなら -E の代わりに --encoding と書くこともできます。-E オプションも --encoding オプションも与えられない場合コンフィギュレーションが行われたときに指定された符号化方式が使われます。
異なる符号化方式のデータベースを作成することができます。
$ createdb -E EUC_KR korean
は EUC_KR 符号化方式で korean という名前のデータベースを作成します。SQL コマンドで同じことを行うには次のようにします。
CREATE DATABASE korean WITH ENCODING = 'EUC_KR';
データベースの符号化方式は pg_database システムカタログにある encoding column で表現されます。 -l オプションか psql の \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.2.1 での実際の 結果にあわせてあります。)
PostgreSQL にはいくつかの符号化方式に対してサーバとクライアントの間で自動的に符号化方式を翻訳する機能を提供しています。使用できる組合せは Table 5-2 にまとめてあります。
Table 5-2. クライアント/サーバ文字セット符号化方式
サーバの符号化方式 | 利用可能なクライアントの符号化方式 |
---|---|
SQL_ASCII | SQL_ASCII、UNICODE、MULE_INTERNAL |
EUC_JP | EUC_JP、SJIS、 UNICODE、MULE_INTERNAL |
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 MULE_INTERNAL |
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 |
ISO_8859_6 | ISO_8859_6、 UNICODE |
ISO_8859_7 | ISO_8859_7、 UNICODE |
ISO_8859_8 | ISO_8859_8、 UNICODE |
ISO_8859_9 | ISO_8859_9、WIN, ALT, KOI8R、 UNICODE、MULE_INTERNAL |
UNICODE | EUC_JP、SJIS、 EUC_KR、EUC_CN、 EUC_TW、BIG5、 LATIN1 から LATIN10、 ISO_8859_5、 ISO_8859_6、 ISO_8859_7、 ISO_8859_8、 WIN、ALT、 KOI8 |
MULE_INTERNAL | EUC_JP、SJIS、EUC_KR、EUC_CN、 EUC_TW、BIG5、LATIN1 から LATIN5、 WIN、ALT、WIN1250 |
KOI8 | ISO_8859_9、WIN、 ALT、 KOI8、 UNICODE、MULE_INTERNAL |
WIN | ISO_8859_9、WIN、 ALT、KOI8、 UNICODE、MULE_INTERNAL |
ALT | ISO_8859_9、WIN、 ALT、 KOI8、 UNICODE、 MULE_INTERNAL |
自動符号化方式を使用できるようにするためには、クライアントでどのような符号化方式を使用させたいかを 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 'encoding';
SQL92 の構文 SET NAMES を同じ目的で使うこともできます。
SET NAMES 'encoding';
現在のクライアントの符号化方式を問い合わせるには次のようにします。
SHOW CLIENT_ENCODING;
デフォルトの符号化方式に戻すのには次のようにします。
RESET CLIENT_ENCODING;
PGCLIENTENCODING を使って。 クライアントの環境で環境変数 PGCLIENTENCODING が定義されているとサーバと接続が確立した時点で自動的にクライアントの符号化方式が選択されます。(上で説明したそのほかのどんな方法でもその後書き換えできます。)
Unicode と他の符号化方式間での自動符号化方式翻訳は PostgreSQL 7.1 からサポートされるようになりました。7.1 ではデフォルトで使えるようになっていません。この機能を使えるようにするには --enable-unicode-conversion オプションをつけてコンフィギュレーションを行います。この場合 --enable-multibyte オプションも必要ですので注意して下さい。
7.2 では --enable-unicode-conversion オプションは必要ありません。
サーバでは EUC_JP が、そしてクライアントでは LATIN1 が選択されていると仮定します。そうすると日本語文字のいくつかは LATIN1 に翻訳することができません。この場合 LATIN1 文字セットで表現できない文字は次のように変形します。
(HEXA DECIMAL)
ここに記したものはさまざまな符号化方式システムを学習するためによい資料です。
セクション 3.2 に EUC_JP、 EUC_CN、EUC_KR、 EUC_TW の詳しい説明があります。
Unicode 協会の Web サイトです。
ここで UTF-8 が定義されています。
Dec 7, 2000 * Unicode と他のエンコード間の符号化方式翻訳の自動化を実装 * この変更は 7.1 から May 20, 2000 * SJIS UDC(NEC による IBM 漢字)サポート(とくやえいじ氏の貢献による) * この変更は 7.0.1 から Mar 22, 2000 * libpq に関数 PQsetClientEncoding と PQclientEncoding を追加 * ./configure --with-mb=EUC_JP の代わりに ./configure --enable-multibyte=EUC_JP を使うように変更 * SQL_ASCII リグレッションテストケースを追加 * SJIS ユーザー定義文字(UDC)をサポート * これらの変更は 7.0 から July 11, 1999 * WIN1250(Windows Czech)サポートをクライアントエンコードに追加 (Pavel Behal の貢献による) * コンパイラの警告について修正(にしやまともあき氏の貢献による) Mar 23, 1999 * KOI8(KOI8-R)、WIN(CP1251)、ALT(CP866)のサポート (Oleg Broytmann によるテストに感謝) * MB とロケールに関する問題を修正 Jan 26, 1999 * フロントエンド符号化方式に Big 5 サポートを追加 (Big5 を使うにはデータベースを EUC_TW で作成してください) * EUC_TW リグレッションテストケースを追加 Dec 15, 1998 * SQL_ASCII サポートに関するバグを修正 Nov 5, 1998 * 6.4リリース。このバージョンから pg_database はデータベースの 符号化方式を表現する「encoding」列を持ちます。 Jul 22, 1998 * 符号化方式の判定をコンパイル時から initdb/createdb に変更 * COPY コマンド実行時の PGCLIENTENCODING をサポート * SQL92 の SET NAMES をサポート * LATIN2-5 をサポート * UNICODE リグレッションテストケースを追加 * MB のテストスイートを追加 * ソースファイルを整理 Jun 5, 1998 * バックエンドとフロントエンドの符号化方式翻訳をサポート * SET CLIENT_ENCODING などの新しいコマンドを追加 * LATIN1 文字セットをサポート * 8 bit 簡潔さの機能強化 April 21, 1998 いくつかの機能強化と修正 * character_length()、position()、substring() で マルチバイト文字を使用可能に * octet_length() を追加 * configure に --with-mb を追加 * 新しいEUC_KRのリグレッションテスト (Soonmyung Hong の貢献による) * EUC_JP のリグレッションテストケースを追加 * System V の regress/regress.sh の問題を修正 * toupper()、tolower() で 8 ビット文字を扱えるように修正 Mar 25, 1998 * PostgreSQL 6.3.1 に MB PL2 を導入 Mar 10, 1998 PL2 のリリース * EUC_JP、EUC_CN、MULE_INTERNAL のリグレッションテストを追加 * 英語ドキュメント(このファイル)を追加 * 8 ビットシングルバイト文字に関する問題を修正 Mar 1, 1998 PL1 のリリース
ロケールサポートが有効となっている PostgreSQL では Windows クライアントプラットフォームでの WIN1250 文字セットが使用できます。
以下の項目に注意が必要です。
特定のシステムシステムロケールでの動作確認がされています。このテストは cs_CZ.iso8859-2 ロケールの、 Red Hat 6.0 と Slackware 3.6 で行われました。
決してサーバーのマルチバイトデータベース符号化方式を WIN1250 に設定しようとしてはいけません。Unix には WIN1250 ロケールが存在しないので常に LATIN2 を使用します。
WIN1250 符号化方式 Windows ODBC クライアントでのみ使用できます。文字はその時点で正しく表示されて再格納されるよう、変換されます。
Windows/ODBC 上の WIN1250
PostgreSQL をロケール動作可能とサーバサイド符号化方式を LATIN2 にしてコンパイルします。
インストレーションの設定を行います。環境変数にロケール変数を作成することを忘れてはいけません。
LC_ALL=cs_CZ.ISO8859-2
ロケールが設定された状態でサーバを稼働させなければなりません。
チェコ語を使ってみてください。そして問い合わせで並び替えをします。
Windows マシン上に PostgreSQL の ODBC ドライバをインストールします。
データソースを正しく設定します。つぎの行を Connect Settings フィールドにある ODBC コンフィギュレーションのダイアログボックスに加えます。
SET CLIENT_ENCODING = 'WIN1250';
こんどは ODBC の入った Windows からもう一度試します。