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

著者: 石井達夫 (), 2000-03-22. 詳細は石井達夫の ウェブページを参照して下さい。

マルチバイト(MB)サポートは、 PostgresでEUC (Extended Unix Code)や Unicode、Mule内部コードなどのマルチバイト文字集合を扱えるようにしているものです。 MBを使用することによって、正規表現(regexp)や LIKE、いくつかの関数でマルチバイト文字を使用できるようになります。 initdbを使ってPostgresを 初期化する際に、ディフォルトのエンコーディングシステムが設定されます。また、 この設定は、SQLコマンド、CREATE DATABASEやcreatedbで データベースを作成する際に変更することができます。したがって、 データベース毎に異ったマルチバイトのエンコーディングシステムを使用することが できます。

また、MBは、ISO8859を含む8ビットのシングルバイト文字セットに ある問題の一部を修正します。(すべての問題を解決するわけではありません。 リグレションテストでは成功し、また、フランス語文字の一部がパッチを 使用することによって受けつけられることを意味しています。8バイト文字を 使用して問題が生じる場合はご一報下さい。)

5.2.1. マルチバイトの使用方法

コンフィギュアを行う際に、マルチバイトオプションを付けて下さい。

% ./configure --enable-multibyte[=encoding_system]
     
この際、encoding_systemには 下記のものを当てはめることができます。

Table 5-1. Postgres 文字エンコーディング設定

エンコーディング説明
SQL_ASCIIASCII
EUC_JP日本語 EUC
EUC_CN中国語 EUC
EUC_KR韓国語 EUC
EUC_TW台湾で使われている EUC
UNICODEユニコード(UTF-8)
MULE_INTERNALMule 内部コード
LATIN1ISO 8859-1 の英語と、ヨーロッパ言語の一部
LATIN2ISO 8859-2 の英語と、ヨーロッパ言語の一部
LATIN3ISO 8859-3 の英語と、ヨーロッパ言語の一部
LATIN4ISO 8859-4 の英語と、ヨーロッパ言語の一部
LATIN5ISO 8859-5 の英語と、ヨーロッパ言語の一部
KOI8KOI8-R(U)
WINWindows CP1251
ALTWindows CP866

下記は、ディフォルトで日本語のエンコーディングを使用するように Postgresのコンフィギュアをする例です。

% ./configure --enable-multibyte=EUC_JP
     

エンコーディングシステムが略された場合 (./configure --enable-multibyte)には、 SQL_ASCIIが使用されます。

5.2.2. エンコーディングの設定

initdbでインストールされる Postgresのディフォルトのエンコーディングを 定義します。

% initdb -E EUC_JP
     
上記の例では、ディフォルトのエンコーディングをEUC_JP(日本語用のEUC) に設定しています。 また、 省略を使用したくないならば、"--encoding" を "-E" の変わりに 使用することも可能です。 もし -E や --encoding のオプションが与えられていなければ、コンフィギュアの際に指定された エンコーディングが適用されます。

また、異ったエンコーディングのデータベースを作成することも可能です。

% createdb -E EUC_KR korean
     
この例では、韓国語(EUC_KR)のエンコーディングを使用する "korean"という名前のデータベースを作成します。 また、同様のことを下記のコマンドで実行することが可能です。
CREATE DATABASE korean WITH ENCODING = 'EUC_KR';
     
データベースのエンコーディングはpg_database システムカタログのencoding columnに 書かれています。 psqlのコマンドで-l、または\lで 見ることができます。
$ psql -l
            List of databases
   Database    |  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)
     

5.2.3. バックエンドとフロントエンド間での自動エンコーディング変換

Postgresでは、バックエンドと フロントエンド間での自動エンコーディング変換をいくつかの エンコーディングに対してサポートしています。

Table 5-2. Postgresクライアント/サーバ文字エンコーディング設定

サーバ側エンコーディング利用可能なクライアントエンコーディング
EUC_JPEUC_JP, SJIS
EUC_TWEUC_TW, BIG5
LATIN2LATIN2, WIN1250
LATIN5LATIN5, WIN, ALT
MULE_INTERNALEUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250

エンコーディングの自動変換を行うには、フロントエンドではどの エンコーディングを使用するかをPostgresに 指定する必要があります。これを行うにはいくつかの方法があります。

5.2.4. ユニコードについて

ユニコードとその他のエンコーディング間のエンコーディング自動変換は PostgreSQL 7.1からサポートされています。これを行うには、 巨大な変換テーブルが必要となるため、ディフォルトでは使用可能になっていません。 この機能を使用するには、コンフィギュアに --enable-unicode-conversion オプションを付けて下さい。 また、この時に --enable-multibyte オプションも 必要となりますので、ご注意下さい。

5.2.5. 変換が不可能な場合の対処方法

例えば、バックエンドにEUC_JPを使用し、フロントエンドではLATIN1を 選択していたとします。この場合、いくつかの日本語はLATIN1に変換することが できません。この場合、LATIN1で表すことができない文字は下記のように 変換されます。

(HEXA DECIMAL)
     

5.2.6. 参考資料

ここに記したものは様々なエンコーディングシステムを学習するためによい資料です。

5.2.7. 歴史

Dec 7, 2000
	* An automatic encoding translation between Unicode and other
	  encodings are implemented
	* Changes above will appear in 7.1

May 20, 2000
	* SJIS UDC (NEC selection IBM kanji) support contributed
	  by Eiji Tokuya
	* Changes above will appear in 7.0.1

Mar 22, 2000
	* Add new libpq functions PQsetClientEncoding, PQclientEncoding
	* ./configure --with-mb=EUC_JP
	  now deprecated. use 
	  ./configure --enable-multibyte=EUC_JP
	  instead
  	* Add SQL_ASCII regression test case
	* Add SJIS User Defined Character (UDC) support
	* All of above will appear in 7.0

July 11, 1999
	* Add support for WIN1250 (Windows Czech) as a client encoding
	  (contributed by Pavel Behal)
	* fix some compiler warnings (contributed by Tomoaki Nishiyama)

Mar 23, 1999
	* Add support for KOI8(KOI8-R), WIN(CP1251), ALT(CP866)
	  (thanks Oleg Broytmann for testing)
	* Fix problem with MB and locale

Jan 26, 1999
	* Add support for Big5 for fronend encoding
	  (you need to create a database with EUC_TW to use Big5)
	* Add regression test case for EUC_TW
	  (contributed by Jonah Kuo )

Dec 15, 1998
	* Bugs related to SQL_ASCII support fixed

Nov 5, 1998
	* 6.4 release. In this version, pg_database has "encoding"
	  column that represents the database encoding

Jul 22, 1998
	* determine encoding at initdb/createdb rather than compile time
	* support for PGCLIENTENCODING when issuing COPY command
	* support for SQL92 syntax "SET NAMES"
	* support for LATIN2-5
	* add UNICODE regression test case
	* new test suite for MB
	* clean up source files

Jun 5, 1998
	* add support for the encoding translation between the backend
	  and the frontend
	* new command SET CLIENT_ENCODING etc. added
	* add support for LATIN1 character set
	* enhance 8 bit cleaness

April 21, 1998 some enhancements/fixes
	* character_length(), position(), substring() are now aware of 
	  multi-byte characters
	* add octet_length()
	* add --with-mb option to configure
	* new regression tests for EUC_KR
  	  (contributed by Soonmyung Hong )
	* add some test cases to the EUC_JP regression test
	* fix problem in regress/regress.sh in case of System V
	* fix toupper(), tolower() to handle 8bit chars

Mar 25, 1998 MB PL2 is incorporated into PostgreSQL 6.3.1

Mar 10, 1998 PL2 released
	* add regression test for EUC_JP, EUC_CN and MULE_INTERNAL
	* add an English document (this file)
	* fix problems concerning 8-bit single byte characters

Mar 1, 1998 PL1 released
     

5.2.8. Windows/ODBC上のWIN1250

Postgresでは、ロケールサポートを 使用すれば、Windowsのクライアントプラットフォームに 設定されているWIN1250文字集合を使うことができます。

下記のことにご注意下さい。

稼働中には、下記のことにご注意下さい。

Windows/ODBC上でのWIN1250

  1. Postgresのコンフィギュアの際、 ロケールを可能とし、マルチバイトエンコーディングをLATIN2に して下さい。

  2. 設定を行って下さい。使っている環境にロケール変数を 忘れずに作成して下さい。下記に例を記しますが、この設定が お使いのシステムで有効であるとは限りません。

    LC_ALL=cs_CZ.ISO8859-2
    LC_COLLATE=cs_CZ.ISO8859-2
    LC_CTYPE=cs_CZ.ISO8859-2
    LC_MONETARY=cs_CZ.ISO8859-2
    LC_NUMERIC=cs_CZ.ISO8859-2
    LC_TIME=cs_CZ.ISO8859-2
           

  3. ロケールを設定し、postmasterを起動させて下さい。

  4. チェコ語で試してみて、順序付けを行ってみて下さい。

  5. マイクロソフトWindowsマシンにPgSQL用ODBCドライバをインストールして下さい。

  6. 適切なデータソースを設定して下さい。ODBCコンフィギュアダイアログの Connect Settingsのフィールドで、下記の1行を 追加して下さい。

    SET CLIENT_ENCODING = 'WIN1250';
           

  7. ODBCがあるWindowsで再度試してみて下さい。