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

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

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

マルチバイトサポートは PostgreSQL バージョン 7.3 からデフォルトで使用できるようになっています。

7.2.1. サポートされる文字セット符号化方式

データベースの符号化方式として以下の符号化方式を使用することができます。

Table 7-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-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
WIN1256Arabic Windows CP1256
TCVNVietnamese TCVN-5712 (Windows CP1258)
WIN874Thai Windows CP874

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

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

7.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 システムカタログにある 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 での実際の結果にあわせてあります。)

7.2.3. サーバ・クライアント間の符号化方式自動変換

PostgreSQL にはいくつかの符号化方式に対してサーバとクライアントの間で自動的に符号化方式を変換する機能を提供しています。変換情報は pg_conversion システムカタログに格納されています。新しい変換を作成するには CREATE CONVERSION を使用します。PostgreSQL には定義済みの変換がいくつか用意されています。定義済みの変換は Table 7-2 にまとめてあります。

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

サーバの符号化方式利用可能なクライアントの符号化方式
SQL_ASCIISQL_ASCIIUNICODEMULE_INTERNAL
EUC_JPEUC_JPSJISUNICODEMULE_INTERNAL
EUC_CNEUC_CN, UNICODE, MULE_INTERNAL
EUC_KREUC_KR, UNICODE, MULE_INTERNAL
JOHABJOHABUNICODE
EUC_TWEUC_TWBIG5UNICODEMULE_INTERNAL
LATIN1LATIN1UNICODEMULE_INTERNAL
LATIN2LATIN2WIN1250UNICODEMULE_INTERNAL
LATIN3LATIN3UNICODEMULE_INTERNAL
LATIN4LATIN4UNICODEMULE_INTERNAL
LATIN5LATIN5UNICODE
LATIN6LATIN6UNICODEMULE_INTERNAL
LATIN7LATIN7UNICODEMULE_INTERNAL
LATIN8LATIN8UNICODEMULE_INTERNAL
LATIN9LATIN9UNICODEMULE_INTERNAL
LATIN10LATIN10UNICODEMULE_INTERNAL
ISO_8859_5ISO_8859_5UNICODEMULE_INTERNALWINALTKOI8
ISO_8859_6ISO_8859_6UNICODE
ISO_8859_7ISO_8859_7UNICODE
ISO_8859_8ISO_8859_8UNICODE
UNICODE EUC_JPSJISEUC_KRUHCJOHABEUC_CNGBKEUC_TWBIG5LATIN1 から LATIN10ISO_8859_5ISO_8859_6ISO_8859_7ISO_8859_8WINALTKOI8WIN1256TCVNWIN874GB18030WIN1250
MULE_INTERNALEUC_JPSJISEUC_KREUC_CNEUC_TWBIG5LATIN1 から LATIN5WINALTWIN1250BIG5ISO_8859_5KOI8
KOI8ISO_8859_5WINALTKOI8UNICODEMULE_INTERNAL
WINISO_8859_5WINALTKOI8UNICODEMULE_INTERNAL
ALTISO_8859_5WINALTKOI8UNICODEMULE_INTERNAL
WIN1256WIN1256UNICODE
TCVNTCVNUNICODE
WIN874WIN874UNICODE

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

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

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

(HEXA DECIMAL)

7.2.5. 参照先

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

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

7.2.6. 歴史

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 リグレッションテストケースを追加 
	  (Jonah Kuo  の貢献による)

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

7.2.7. 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 からもう一度試します。