他のバージョンの文書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

5.2. マルチバイトサポート

著者: 石井 達夫 ()、最終更新日 2000-03-22。より詳しくは 石井達夫のweb サイト を参照して下さい。

マルチバイト(MB)サポートは PostgreSQL で EUC(拡張 Unix コード)、Unicode、および Mule 内部コードなどのマルチバイト文字セットを扱えるように意図されたものです。 MBが使えると、正規表現(regexp)、LIKE、いくつかの関数でマルチバイト文字セットが使えます。initdb を使って PostgreSQL インストレーションを初期化する際にデフォルトの符号化システムが選択されます。この設定は createdb または SQL の CREATE DATABASE コマンドでデータベースを作成する際に上書きすることができます。したがって、データベースごとに異なった符号化システムによる複数のデータベースを持つことができます。

5.2.1. マルチバイトサポートの付与

マルチバイトオプションを付けて configure を実行します。

./configure --enable-multibyte[=encoding_system]

ここで encoding_system は以下の表にある値のうちのひとつです。

Table 5-1. 文字セット符号化方式

符号化説明
SQL_ASCIIASCII
EUC_JP日本語 EUC
EUC_CN中国語 EUC
EUC_KRハングル 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-5ECMA-113 Latin/Cyrillic
ISO-8859-6ECMA-114 Latin/Arabic
ISO-8859-7ECMA-118 Latin/Greek
ISO-8859-8ECMA-121 Latin/Hebrew
KOI8KOI8-R(U)
WINWindows CP1251
ALTWindows CP866

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

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

デフォルトで PostgreSQL が日本語符号化方式を使用できるようにコンフィギュレーションする例です:

$ ./configure --enable-multibyte=EUC_JP

もし符号化システムが省略された場合 (./configure --enable-multibyte)、 SQL_ASCII が使用されます。

5.2.2. 符号化方式の設定

initdbPostgreSQL のひとつのインストレーションのデフォルトの符号化方式を定義します。例です。

$ 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 での実際の
結果にあわせてあります。)

5.2.3. サーバ・クライアント間の符号化方式自動翻訳

PostgreSQL にはいくつかの符号化方式に対してサーバとクライアントの間で自動的に符号化方式を翻訳する機能を提供しています。使用できる組合せは Table 5-2 にまとめてあります。

Table 5-2. クライアント/サーバ文字セット符号化方式

サーバの符号化方式利用可能なクライアントの符号化方式
SQL_ASCIISQL_ASCIIUNICODEMULE_INTERNAL
EUC_JPEUC_JPSJISUNICODEMULE_INTERNAL
EUC_TWEUC_TWBIG5UNICODEMULE_INTERNAL
LATIN1LATIN1UNICODE MULE_INTERNAL
LATIN2LATIN2WIN1250UNICODEMULE_INTERNAL
LATIN3LATIN3UNICODE MULE_INTERNAL
LATIN4LATIN4UNICODE MULE_INTERNAL
LATIN5LATIN5UNICODE MULE_INTERNAL
LATIN6LATIN6UNICODE MULE_INTERNAL
LATIN7LATIN7UNICODE MULE_INTERNAL
LATIN8LATIN8UNICODE MULE_INTERNAL
LATIN9LATIN9UNICODE MULE_INTERNAL
LATIN10LATIN10UNICODE MULE_INTERNAL
ISO_8859_5ISO_8859_5UNICODE
ISO_8859_6ISO_8859_6UNICODE
ISO_8859_7ISO_8859_7UNICODE
ISO_8859_8ISO_8859_8UNICODE
ISO_8859_9ISO_8859_9WIN, ALT, KOI8RUNICODEMULE_INTERNAL
UNICODE EUC_JPSJISEUC_KREUC_CNEUC_TWBIG5LATIN1 から LATIN10ISO_8859_5ISO_8859_6ISO_8859_7ISO_8859_8WINALTKOI8
MULE_INTERNALEUC_JPSJISEUC_KREUC_CNEUC_TWBIG5LATIN1 から LATIN5WINALTWIN1250
KOI8ISO_8859_9WINALTKOI8UNICODEMULE_INTERNAL
WINISO_8859_9WINALTKOI8UNICODEMULE_INTERNAL
ALTISO_8859_9WINALTKOI8UNICODEMULE_INTERNAL

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

5.2.4. Unicode について

Unicode と他の符号化方式間での自動符号化方式翻訳は PostgreSQL 7.1 からサポートされるようになりました。7.1 ではデフォルトで使えるようになっていません。この機能を使えるようにするには --enable-unicode-conversion オプションをつけてコンフィギュレーションを行います。この場合 --enable-multibyte オプションも必要ですので注意して下さい。

7.2 では --enable-unicode-conversion オプションは必要ありません。

5.2.5. 翻訳が不可能な場合に起こること

サーバでは EUC_JP が、そしてクライアントでは LATIN1 が選択されていると仮定します。そうすると日本語文字のいくつかは LATIN1 に翻訳することができません。この場合 LATIN1 文字セットで表現できない文字は次のように変形します。

(HEXA DECIMAL)

5.2.6. 参考文献

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

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 が定義されています。

5.2.7. 歴史

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 のリリース

5.2.8. Windows/ODBC 上の WIN1250

ロケールサポートが有効となっている PostgreSQL では Windows クライアントプラットフォームでの WIN1250 文字セットが使用できます。

以下の項目に注意が必要です。

Windows/ODBC 上の WIN1250

  1. PostgreSQL をロケール動作可能とサーバサイド符号化方式を LATIN2 にしてコンパイルします。

  2. インストレーションの設定を行います。環境変数にロケール変数を作成することを忘れてはいけません。

    LC_ALL=cs_CZ.ISO8859-2

  3. ロケールが設定された状態でサーバを稼働させなければなりません。

  4. チェコ語を使ってみてください。そして問い合わせで並び替えをします。

  5. Windows マシン上に PostgreSQL の ODBC ドライバをインストールします。

  6. データソースを正しく設定します。つぎの行を Connect Settings フィールドにある ODBC コンフィギュレーションのダイアログボックスに加えます。

    SET CLIENT_ENCODING = 'WIN1250';

  7. こんどは ODBC の入った Windows からもう一度試します。