PostgreSQL 7.2 multi-byte (MB) support README	       2001/9/18 作成

							石井達夫
						ishii@postgresql.org
		  http://www.sra.co.jp/people/t-ishii/PostgreSQL/

■はじめに

  PostgreSQL におけるマルチバイトサポートは以下のような特徴を持っています．

    1. マルチバイト文字として，日本語，中国語などの各国の EUC，Unicode，
       mule internal code, ISO-8859-* がデータベース作成時に選択可能．
       データベースにはこのコードのまま格納されます．
    2. テーブル名にマルチバイト文字が使用可能
    3. カラム名にマルチバイト文字が使用可能
    4. データそのものにもマルチバイト文字が使用可能
    5. マルチバイト文字の正規表現検索が使用可能
    6. マルチバイト文字の LIKE 検索が使用可能
    7. character_length(), position(), substring() などの文字列関数で
       のマルチバイトサポート
    8. フロントエンド側のエンコーディングがバックエンド側と異る場合に，
       自動的にコード変換を行ないます．

■インストール

  デフォルトのコンフィギュレーションでは PostgreSQL はマルチバイトを
  サポートしていません．マルチバイトサポートを有効にする方法を説明します．

  たとえば日本語 EUC を主に利用する場合は，configure 起動時に以下のよ
  うに指定します．

  $ ./configure --enable-multibyte=EUC_JP

  7.1 では，--enable-unicode-conversion を指定しないと Unicode とそれ
  以外のエンコーディングの間の変換ができませんでしたが，7.2 以降では単
  に --enable-multibyte を指定しただけで自動的に
  --enable-unicode-conversion が有効になります．ただし，
  --enable-multibyte を指定しながら，--enable-unicode-conversion だけ
  を無効にすることはできません．

  エンコーディングとしては EUC_JP の他，以下が指定できます．

	SQL_ASCII	ASCII
	EUC_JP		日本語 EUC
	EUC_CN		GB をベースにした中文EUC．code set 2 は
			SS2+2バイトコード = 3バイト表現です．
	EUC_KR		韓国語 EUC．
	JOHAB		ハングルベースの韓国語EUC.
	EUC_TW		台湾の EUC．code set 2 は
			SS2+面番号+2バイトコード = 4バイト表現です．
	UNICODE		UTF-8．ただしサポートするのは UCS-2 の範囲，
			すなわち 0xffff までです．
	MULE_INTERNAL	mule の内部コード．ただし，Type N の不定長文字は
			サポートしていません．
	LATIN*		ISO8859 Latin シリーズ．* は 1 から 5 まで指定
			できます．
	キリル文字	KOI8(KOI8-R), WIN(CP1251), ALT(CP866)をサポート
			しています．もちろん ISO 8859-5 も使用可能です．
			この場合，"LATIN5" として指定して下さい．
	WIN1256		アラブ諸国語Windows用エンコーディング.
	TCVN		ベトナム語."ABC"や"VSCII"も使用可能.
	WIN874		タイ語.

  選択の目安としては，英語と日本語しか使わない場合は EUC_JP(同様に，中
  国語しか使わない場合は EUC_CN... などとなります)，その他の言語も使いた
  い場合は UNICODE もしくは MULE_INTERNAL となるでしょう．

  エンコーディングを省略した場合，デフォルト値として SQL_ASCII が採用
  されます．

  なお，configure で選択したエンコーディングは，あくまで initdb のための
  デフォルト値程度の意味しかありません(initdb では引数でエンコーディングが
  指定できます)．したがって，異なるエンコーディングを使用するために
  わざわざ PostgreSQL をリコンパイルする必要ありません．

  initdb は shell script なので，デフォルトのエンコーディングは script を
  適当なエディタで編集することにより簡単に変更できます．initdb の 61行目
  付近に，

  MULTIBYTE=EUC_JP

  のような行があるので，= 以降を希望するエンコーディングに変えるだけです．

  注意：MULE_INTERNAL を選ぶと，たくさんの文字集合に対応できて便利です
  が，正規表現で複数の文字集合にまたがるような範囲指定(たとえば，[a-範]
  とか，[abc範囲]のような)は使えません．複数の範囲指定で異なる文字集合
  を使うのは構いません(たとえば [abc][範-囲])．また，[^a] のような表現
  は，"a" の属する文字集合(この場合，US-ASCII)において "a" 以外である
  ことを表します．決して漢字や平仮名など "a" 以外をすべて表すわけでは
  ないことに注意して下さい．

  インストールは --enable-multibye なしの場合と同様に行ないます．イン
  ストールの詳細は INSTALL というテキストファイルを御覧下さい．また，
  http://www.sra.co.jp/people/t-ishii/PostgreSQL/ でも簡単なインストー
  ル方法を紹介しています．

■initdb/createdb/create database におけるエンコーディングの指定について

  initdb では以下のオプションでエンコーディングが指定できます．

	-E エンコーディング
	--encoding=エンコーディング

  ここで指定したエンコーディングは，以後 createdb/create database でエ
  ンコーディングを省略した場合に設定されるエンコーディングになります．
  -E または --encoding オプションを省略した場合は，configure で指定し
  たエンコーディングが採用されます．

  createdb では以下のオプションでエンコーディングが指定できます．

	-E エンコーディング
	--encoding=エンコーディング

  create database では以下のオプションでエンコーディングが指定できます．

	CREATE DATABASE dbanme WITH ENCODING = 'エンコーディング';

  LOCATION を同時に指定する場合は以下のようになります．

	CREATE DATABASE dbanme WITH LOCATION = 'path' ENCODING = 'エンコーディング';

  createdb/create database では，エンコーディング指定を省略した場合は，initdb 
  で指定したエンコーディングが採用されます．これは，initdb が作成する
  テンプレートデータベース(template1)の encoding アトリビュートを継承
  するからです．

  データベースのエンコーディングは，psql -l，psql の \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)

■文字型のデータ型について

  7.2では，CHAR(n)とVARCHAR(n)の n は文字数を意味します．n がバイト数を
  意味する 7.1 以前とは異なりますのでご注意下さい．

  例を示します．

  7.2では，CHAR(1)に"あ"を格納できますが，7.1以前では格納できませんこ
  れは，"あ"を格納するために少なくとも2バイト以上を要するからです．
  逆に，"a" は1バイトしか消費しないため，7.1でも CHAR(1) に格納できま
  す．

  なお，7.2では，7.1までと異なり，CHAR(n)に格納できない n 文字より大き
  い文字列は n 文字で切り捨てられるのではなく，エラーになることにご注
  意下さい．これは，マルチバイト対応の有無に関わらず，文字列の扱いが
  SQL標準に沿うように変ったからです．

■フロントエンドとバックエンドの自動エンコーディング変換について

  バックエンド(データベース)と psql などのフロントエンドのエンコーディ
  ングは一致しているのが原則ですが，いくつかのエンコーディングについて
  はバックエンドとフロントエンドの間で異なるものを使用することができま
  す．この場合，自動的にバックエンドでエンコーディング変換が行われます．

  バックエンドのエンコーディング	許容されるフロントエンドの
					エンコーディング
  ----------------------------------------------------------------
	EUC_JP				EUC_JP, SJIS, UNICODE

	EUC_TW				EUC_TW, BIG5, UNICODE

	EUC_CN				EUC_CN, UNICODE

	EUC_KR				EUC_KR, UNICODE

	JOHAB				JOHAB, UNICODE

	LATIN1,3,4			LATIN1,3,4, UNICODE

  	LATIN2				LATIN2, WIN1250, UNICODE

	LATIN5				LATIN5, WIN, ALT, UNICODE

	LATIN6,7,8,9,10			LATIN6,7,8,9,10, UNICODE

	ISO_8859_5,6,7,8		ISO_8859_5,6,7,8, UNICODE

	WIN1256				WIN1256, UNICODE

	TCVN				TCVN, UNICODE

	WIN874				WIN874, UNICODE

	MULE_INTERNAL			EUC_JP, SJIS, EUC_KR, EUC_CN, 
					EUC_TW, BIG5, LATIN1から5, 
					WIN, ALT, WIN1250

	UNICODE				EUC_JP, SJIS, EUC_KR, UHC,
					EUC_CN, GBK, EUC_TW, BIG5,
					LATIN1から10, ISO_8859_5から8,
					WIN, ALT, WIN1250, WIN1256,
					TCVN, WIN874, JOHAB
  ----------------------------------------------------------------

  バックエンドとフロントエンドのエンコーディングが異なる場合，そのこと
  をバックエンドに伝える必要があります．そのための方法がいくつかありま
  す．

o psql の \encoding コマンドを使う方法

  psqlでは，\encodingコマンドを使って動的にフロントエンド側の文字コー
  ドを切替えることができます．例:

	\encoding SJIS

o libpq の関数 PQsetClientEncoding を使う方法

  7.0 から新しい libpq 関数 PQsetClientEncoding が追加されています．

  PQsetClientEncoding(PGconn *conn, const char *encoding)

  この関数を使えば，コネクション毎にエンコーディングを切替えることがで
  きます．現在のエンコーディングの問い合わせは

  int PQclientEncoding(const PGconn *conn)

  です．

o 環境変数 PGCLIENTENCODING を使う方法

  上記方法で対応できない場合，あるいはフロントエンドで使われるエンコー
  ディングがあらかじめ分かっている場合は環境変数 PGCLIENTENCODING を使
  うのが便利です．この方法は更に大きく2つに分かれます．

  (1) postmaster 起動時に環境変数を設定する方法

  すべてのクライアント(フロントエンド)が同じエンコーディングを使うのが
  分かっている場合，postmaster 起動時に環境変数 PGCLIENTENCODING を設
  定します．この場合でも，(2)の方法で個々のクライアント毎に別のエンコー
  ディングを設定することができます．

  (2) クライアント，フロントエンド毎にエンコーディングを設定したい場合

  この場合はそのフロントエンド(たとえば psql)を起動する前に環境変数 
  PGCLIENTENCODING を設定します．

o set client_encoding コマンドを使う方法

  上記(2)の方法は，libpq を使っていない JDBC や ODBC では使用できませ
  ん．この場合，SQLコマンドである set client_encoding コマンドを利用し
  ます．例：

	set client_encoding to 'sjis';

■現在設定されているフロントエンド側のエンコーディングを調べる

 現在設定されているフロントエンド側のエンコーディングは

	show client_encoding;

  で参照できます．

■デフォルトのエンコーディングへの復帰

  SQLコマンド:

	reset client_encoding;

  は，デフォルトのフロントエンドエンコーディング設定に復帰させます．
  postmasterを立ち上げるときに環境変数 PGCLIENTENCODING が設定されてい
  るとそのエンコーディングに，そうでなければデータベースのエンコーディ
  ングと同じになります．
  
■明示的なエンコーディング変換

  7.2では，convertという関数を使い，明示的なエンコーディング変換ができ
  ます．

  convert(string text, [src_encoding name,] dest_encoding name) 

  ここでsrc_encodingはtextのエンコーディング名です．省略すると，データ
  ベースエンコーディング名と同じであると見なされます．dest_encodingは，
  変換後のエンコーディング名です．

  例を示します．

  SELECT convert(text, EUC_JP) FROM unicode_tbl;

  は，Unicodeのテーブルunicode_tblのtext列をEUC_JPに変換して返します．

■エンコーディング変換不能の場合の処理

  バックエンド側のエンコーディングとフロントエンド側のエンコーディング
  がいつも相互変換できるとは限りません．極端な話，バックエンド側が 
  EUC_JP なのに，フロントエンド側が EUC_KR だったらどうなるでしょう．
  この場合 PostgreSQL は変換できないコードを 16進表現に変換します．
  たとえば，"(bdae)" のように．なお，この 16進表現は mule
  internal code のコードであることに注意して下さい．これは，直接フロン
  トエンド <--> バックエンドのエンコーディングを変換するのではなく，一
  度内部表現である mule internal code を経由しているためです．

  なお，Unicodeとそれ以外のエンコーディングの変換だけは例外で，NOTICE
  メッセージが表示され，変換不能の文字は無視されます．

■SJISユーザ定義文字への対応

  7.0 から SJISユーザ定義文字 (UDC) に対応しています．UDC をどう扱うか
  と言うことについて中条さん(nak@email.com)から問題提起と詳細な解説を
  頂きましたので，参考のためにこのドキュメントの最後に付けておきます．
  また，この問題については，PostgreSQL日本語メーリングリストの 
  [pgsql-jp 12288] (1999/12/17付)と [pgsql-jp 12486] (2000/1/5付) から
  始まるスレッドで議論を見ることができます(メールのアーカイブは
  http://www.sra.co.jp/people/t-ishii/PostgreSQL/ で参照できます)．

  ここでは，それらの議論をふまえ，簡単に解説します．

  PostgreSQLでは，日本語を使用する際にバックエンド側のエンコーディング
  を EUC_JP または MULE_INTERNAL or Unicode にする必要があります．
  MULE_INTERNAL は EUC_JP に文字集合を表すコードを付けたものなので，本
  質的に同じです．また，Unicode <---> SJIS 変換は現在のところサポート
  されていませんので無視します．したがって，ここでは EUC_JP と SJIS の
  相互変換のみを考えます．

  予備知識

  一口に EUC_JP といっても，実際には中身は複数の文字集合から成り立って
  います．

	G0: JIS ROMAN (ASCII とほぼ同じ)
	G1: JIS X 0208 (JIS 漢字)
	G2: JIS X 0201 (1バイトカナ)
	G3: JIS X 0212 (JIS 補助漢字)

  一方 SJIS はこのうち基本的に G0, G1, G2 をサポートしており，G3 はサ
  ポートしていません．したがって，SJIS は EUC_JP の部分集合とみなすこ
  とができ，実際 PostgreSQL 6.5 まではこの考えで実装されていました．

  ところが，Windows PC の SJIS の世界では，上記 JIS 規格で定義されてい
  ない文字コードが一部利用されており，この部分 (UDC) は従来 PostgreSQL 
  では全く考慮されていませんでした．実際 UDC を含む SJIS を EUC_JP に
  変換するときに不正な変換が行われていました．そこで PostgreSQL 7.0 で
  は，まずこの問題を解決することにしました．

  また，UDC の利用方については標準規格のようなものはありませんが，実は
  業界団体での取り決めがあり，いわゆるデファクトスタンダードならば存在
  することが分かりました．そこでこれについてもできるだけサポートするこ
  とにしました．

  PostgreSQL 7.0 での UDC 対応の実装

  (1) ユーザ定義文字領域は JIS のユーザ定義文字領域にマッピングする．
  SJIS と EUC_JP で1対1の対応になります．

    - SJIS ユーザ定義文字領域 A (仮称)
          95〜104 区  ←→ 日本語 EUC / G1 (JIS X 0208) 85〜95 区

    - SJIS ユーザ定義文字領域 B (仮称)
         105〜114 区  ←→ 日本語 EUC / G3 (JIS X 0212) 85〜95 区

  (2) IBM 拡張文字領域 (SJIS 115〜120 区)

  変換テーブルによって G1 (JIS X 0208)と，G3 (JIS X 0212)に変換されま
  す．なお，この変換においては，SJIS --> EUC_JP で変換し，再び EUC_JP --
  > SJIS に変換すると元の SJIS に戻らないことがあります．また，EUC_JP --
  > SJIS の変換では，すべての文字を変換できるわけではないので，その場
  合は変換不能文字として「〓」に置き換えます．

  *業界団体の取り決めでは，変換不能文字は「実装依存」となっていますが，
  Solaris をはじめ，多くのシステムが「〓」を変換不能文字に採用していま
  す．PostgreSQLもこれに合わせました．

  (3) NEC 選定 IBM 拡張文字領域 (SJIS 89〜92 区)
  
  PostgreSQL 7.0ではすべて変換不能文字「〓」に置き換えられます．

  PostgreSQL 7.0.1以降では，一旦 IBM 拡張文字領域に変換された後，G1
  (JIS X 0208)と，G3 (JIS X 0212)に変換されます．

謝辞：

  o 徳家@三協運輸サービスさんから，NEC 選定 IBM 漢字対応パッチを提供し
    ていただきました．

  o 各種文字セット，コード系について，日本語 PostgreSQL メーリングリスト
    のメンバの方からアドバイスを頂きました．ここに感謝します．
    また，SJIS 対応については，市川@お茶大さんのパッチを参考にさせてい
    ただきました．

  o SJISユーザ定義文字 (UDC) をどう扱うかと言うことについて中条さん
    (nak@email.com)から問題提起と詳細な解説を頂きました．

■Unicodeとそれ以外のエンコーディングとの相互変換について

  PostgreSQL 7.1からUnicodeとそれ以外のエンコーディングとの相互変換が
  可能になりました．この変換はごく一部の文字コード(ISO 8859-1)をのぞき，
  ロジックによる変換ができないため，変換の際にはテーブルが必要になりま
  す．PostgreSQLの実装では，Unicode変換テーブルは Unicode organization 
  が提供するものを使用，これをPerlプログラムでC言語のテーブルに変換し
  て作成しています(PerlプログラムはNARITA Tomio氏作成のlvバージョン
  4.3.6 に付属するものを改造の上，利用しています)．Unicode
  organizationの提供する変換テーブルは再配布が許可されていないため，
  PostgreSQLのソースコードには含まれていません．以下，使用した変換テー
  ブルを列挙します．

  エンコーディング	変換テーブル
  ============================================================
  ISO 8859-1		なし
  ISO 8859-2		8859-2.TXT
  ISO 8859-3		8859-3.TXT
  ISO 8859-4		8859-4.TXT
  ISO 8859-5		8859-5.TXT
  ISO 8859-6		8859-6.TXT
  ISO 8859-7		8859-7.TXT
  ISO 8859-8		8859-8.TXT
  ISO 8859-9		8859-9.TXT
  ISO 8859-10		8859-10.TXT
  ISO 8859-13		8859-13.TXT
  ISO 8859-14		8859-14.TXT
  ISO 8859-15		8859-15.TXT
  ISO 8859-16		8859-16.TXT
  EUC_JP		JIS0201.TXT, JIS0208.TXT, JIS0212.TXT,
			CP932.TXT, sjis.map
  SJIS			CP932.TXT
  EUC_CN		GB2312.TXT
  GBK			CP936.TXT
  EUC_KR		KSX1001.TXT
  UHC			CP949.TXT
  JOHAB			JOHAB.TXT
  EUC_TW		CNS11643.TXT
  Big5			BIG5.TXT
  WIN1256		CP1256.TXT
  TCVN			CP1258.TXT
  WIN874		CP874.TXT
  ============================================================

謝辞：

  o 徳家@三協運輸サービスさんから，CP932.TXTより生成したSJIS用の変換テー
    ブルを提供していただきました．これにより，IBM 拡張文字領域 (SJIS
    115〜120 区), NEC 選定 IBM 拡張文字領域 (SJIS 89〜92 区)に対応する
    ことができるようになりました．


参考1：

  Pavel Behal氏により提供されたWIN1250サポートですが，Windows環境での
  利用の仕方について参考になるドキュメントが付属しているので，ここに添
  付しておきます．

  -------------------------------------------------------------------
Version: 0.91 for PgSQL 6.5
Author: Pavel Behal
Revised by: Tatsuo Ishii
Email: behal@opf.slu.cz
Licence: The Same as PostgreSQL

Sorry for my Eglish and C code, I'm not native :-)

!!!!!!!!!!!!!!!!!!!!!!!!! NO WARRANTY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Instalation:
------------
1) Change three affected files in source directories 
    (I don't have time to create proper patch diffs, I don't know how)
	[PostgreSQL 6.5.1ではこのステップは必要ありません．-- 石井]
2) Compile with enabled locale and multibyte set to LATIN2
3) Setup properly your instalation, do not forget to create locale
   variables in your profile (environment). Ex. (may not be exactly true):
	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
4) You have to start the postmaster with locales set!
5) Try it with Czech language, it have to sort
5) Install ODBC driver for PgSQL into your M$ Windows
6) Setup properly your data source. Include this line in your ODBC
   configuration dialog in field "Connect Settings:" :
	SET CLIENT_ENCODING = 'WIN1250';
7) Now try it again, but in Windows with ODBC.

Description:
------------
- Depends on proper system locales, tested with RH6.0 and Slackware 3.6,
  with cs_CZ.iso8859-2 loacle
- Never try to set-up server multibyte database encoding to WIN1250,
  always use LATIN2 instead. There is not WIN1250 locale in Unix
- WIN1250 encoding is useable only for M$W ODBC clients. The characters are
  on thy fly re-coded, to be displayed and stored back properly
 
Important:
----------
- it reorders your sort order depending on your LC_... setting, so don't be
  confused with regression tests, they don't use locale
- "ch" is corectly sorted only in some newer locales (Ex. RH6.0)
- you have to insert money as '162,50' (with comma in aphostrophes!)
- not tested properly
  -------------------------------------------------------------------

参考2：SJISユーザ定義文字 (UDC) をどう扱うかと言うことについて中条さん
    (nak@email.com)からいただいた問題提起と解説です．

-------------------------- 引用開始 ----------------------------------
---
1. SJIS コードの範囲

    1 バイト目 0x81 - 0x9F，0xE0 - 0xFC
    2 バイト目 0x40 - 0x7E，0x80 - 0xFC

    いわゆる「外字領域」の範囲:

    - X0208 共通自由領域

    |--------------------
    | 85 区  0xEB40 〜
    |...
    |--------------------
    | 89 区  0xED40 〜    ; 89〜92 区は
    |...                  ; 「NEC 選定 IBM 拡張文字領域」
    |-------------------- ; と呼ばれる
    | 93 区  0xEF40 〜
    | 94 区  0xEF9F 〜 0xEFFC

    - ユーザ定義文字領域
    
    |--------------------
    | 95 区  0xF040 〜    ; 95〜104 区
    |...                  ; 「ユーザ定義文字領域 A」(仮称)
    |--------------------
    |105 区  0xF540 〜    ; 105〜114 区
    |...                  ; 「ユーザ定義文字領域 B」(仮称)
    |--------------------
    |115 区  0xFA40 〜    ; 115〜120 区は一般に
    |...                  ; 「IBM 拡張文字領域」
    |120 区  ...          ; と呼ばれる
    |--------------------

---
2. i-mode 端末が使っている図形文字コードの範囲

    0xF89F - 0xF8FC  (112 区)
    0xF940 - 0xF949  (113 区)
    0xF972 - 0xF97E  (113 区)
    0xF980 - 0xF990  (113 区)
    0xF9B0           (114 区)

---
3. 一般的な EUC 日本語コードの定義

    G0 : [0x21-0x7E]                  ; いわゆる JIS ROMAN
    G1 : [0xA1-0xFE] [0xA1-0xFE]      ; JIS X 0208 
    G2 : 0x8E [0xA1-0xDF]             ; JIS X 0201 カナ
    G3 : 0x8F [0xA1-0xFE] [0x21-0x7E] ; JIS X 0212 補助漢字

---
[問題点]

SJIS 95〜120 区は JIS X0208 に該当する領域が存在しない
ため，この領域の EUC - SJIS 文字コード変換は各ベンダに
よって異なるのではないか，というのが石井様からのご指摘
でした．

---
[議論]

調査の結果，SJIS 95〜120 区を EUC に変換するための標準的な
ルールがないわけではない，ということがわかりました．詳細は
後述の参考資料をご覧いただくとして，ここではそのルールを
簡単にご説明いたします．

   - SJIS ユーザ定義文字領域 A (仮称)
          95〜104 区  ←→ 日本語 EUC / G1 85〜95 区

         たとえば SJIS の (95, 1) = 0xF040 は
         EUC の 0xF5A1 になります．

   - SJIS ユーザ定義文字領域 B (仮称)
         105〜114 区  ←→ 日本語 EUC / G3 85〜95 区

         たとえば SJIS の (105, 1) = 0xF540 は
         EUC の 0x8FF5A1 になります．

   - IBM 拡張文字領域
         115〜120 区

         JIS X 0208 (日本語 EUC / G1)，JIS X 0212 
         (日本語 EUC / G3) に該当する文字がある場合
         はその文字にマッピング．そうでない場合は
         日本語 EUC / G3 83〜84 区を，区点コードの上位
         から順に割り当てていく (変換テーブル方式)

この仕様は，広く使われている SJIS と EUC のマッピングがベンダに
よって異なるため，相互運用の際に問題になっていることから，1996 
年に OSF 日本ベンダ協議会が検討作成した報告書がベースになってい
るようです．

Solaris のドキュメントには「TOG 日本ベンダ協議会推奨 EUC・シフト 
JIS コード変換仕様」にもとづくと書いてあり，Solaris 2.6 から導入
しているのだそうで，私から見れば事実上の標準と考えても不自然では
ないと感じます．

なお，少なくとも 1996 年当時においては，Oracle や Sybase は 
SJIS のユーザ定義/ベンダ定義文字領域を EUC に変換する際，判別不
可能文字として扱っているらしいということも補足しておきます．

---
[参考資料]

// URL が長いので，途中で切れないといいのですが...

-「日本語 EUC・シフト JIS コード変換仕様とコード系実態調査」
    1966, OSF 日本ベンダ協議会
    http://www.opengroup.or.jp/jvc/cde/sjis-euc.html

-「文字コード変換規則」
    Solaris 7，JFP ユーザーズガイド
    http://docs.sun.com/ab2/coll.139.3/JFPUG/@Ab2PageView/11683?Ab2Lang=ja&Ab2Enc=euc-jp

-「日本語文字コード」
    Solaris 7，JFP ユーザーズガイド
    http://docs.sun.com/ab2/coll.139.3/JFPUG/@Ab2PageView/879;td=5?Ab2Lang=ja&Ab2Enc=euc-jp

    // 謎の「1〜20 区」の記述はここからきています．

---
-------------------------- 引用ここまで ---------------------------------

改定履歴：

  2001/10/01
	* CONVERTの追加．lpad/rpad/trim/btrim/ltrim/rtrim/translateの
	  マルチバイト対応追加．char/varcharでバイト数ではなく，文字数
	  でサイズを定義するように変更．以上，7.2に反映されます．

  2001/2/15
	* 徳家@三協運輸サービスさんから，CP932.TXTより生成したSJIS用の
	  変換テーブルを提供していただきました．7.1に反映されます．

  2001/1/6
	* UNICODEと他のエンコーディングとの相互変換機能を追加．
	* 7.1に反映されます．

  2000/5/20
	* NEC 選定 IBM 漢字対応を追加しました．これは 徳家@三協運輸サービス
	  さんからの contribute です．
	* これらは，7.0.1 に反映されます．

  2000/3/22
	* PQsetClientEncoding, PQclientEncoding をlibpq 関数に追加，
	  コネクション毎にエンコーディングを変更可能に．
	* SJIS ユーザ定義文字 (UDC) への対応
  	* ./configure --with-mb=EUC_JP から
	  ./configure --enable-multibyte=EUC_JP に変更
  	* SQL_ASCII の regression test 追加
	* これらは 7.0 に反映されます．

  1999/7/11 WIN1250(Windows用のチェコ語)サポートを追加しました．
	* WIN1250 がフロントエンド側のエンコーディングとして利用できるよ
	  うになりました．この場合，バックエンド側のエンコーディングは
	  LATIN2 または MULE_INTERNAL とします．
	  (contributed by Pavel Behal)
	* backend/utils/mb/conv.cにおける型の不整合を修正しました．
	  (contributed by Tomoaki Nishiyama)
	* これらは6.5.1に反映されます．

  1999/3/23 キリル文字サポート追加他(6.5 に反映済)
	* エンコーディングとして KOI8(KOI8-R), WIN(CP1251), ALT(CP866) を
	  サポートしています．これらは，フロントエンド，バックエンド，
	  どちらのエンコーディングとしても使用可能であり，エンコーディングの
	  相互変換が可能です．また，従来からサポートしている ISO 8859-5 も
	  同様に使用可能です．
	  キリル文字サポートは，Oleg Broytmann <phd@sun.med.ru> 氏の
	  リクエスト及び協力により実現しました．これは，従来からある
	  RCODE サポートの機能を取り込むものでもあります．
	* MB と locale を同時に指定した場合に大文字／小文字を無視した
	  正規表現検索が正常に動作しないバグを修正

  1999/1/26 Big5 サポート追加(6.4.2-patched/6.5 に反映済)
	* Big5 がフロントエンド側のエンコーディングとして利用できるよ
	  うになりました．この場合，バックエンド側のエンコーディングは
	  EUC_TW または MULE_INTERNAL とします．
	* EUC_TW の regression test ケースを追加
	  (contributed by Jonah Kuo <jonahkuo@mail.ttn.com.tw>)

  1998/12/16 本ドキュメント修正(6.4.2 に反映済)．
	* Makefile.custom で MB=EUC_JP などと設定する方法は 6.4 以降
	  サポートされていないので削除した．
	* 文字コード → エンコーディング，クライアント→フロントエンド
	  サーバ→バックエンド にそれぞれ語句を修正．

  1998/12/15 6.4 向けバグ修正パッチリリース(6.4.2 に反映済)．
	* SQL_ASCII サポートのバグ修正

  1998/11/21 6.4 向けバグ修正パッチリリース(6.4.2 に反映済)．
	* BINARY CURSOR の問題を修正
	* pg_dumpall のバグ修正

  1998/11/5 6.4 リリース．
	* pg_database の encoding カラムが MB が有効でないときにも
	  追加されるようになった．そのため，MB が有効でないときには，
	  ASCII のエンコーディングを表す SQL_ASCII を新しいエンコーディング
	  として追加した．これにともない，エンコーディング名に対応する
	  エンコーディングIDが SQL_ASCII を 0 とする番号に変更になった．

  1998/7/22 6.4 α向けにパッチをリリース．
	* initdb/createdb/create database でバックエンド側の
	  エンコーディングを設定きる機能実装．このため，システムカタロ
	  グの pg_database に新しいカラム encoding を追加(MBが有効な時だけ)
	* copy が PGCLIENTENCODING に対応
	* SQL92 の "SET NAMES" をサポート(MBが有効な時だけ)
	* LATIN2-5 をサポート
	* regression test に unicode のテストケースを追加
	* MB 専用の regression テストディレクトリ test/mb を追加
	* ソースファイルの置き場所を大幅見直し．MB 関係は
	  include/mb, backend/utils/mb に置くようにした

  1998/5/25 バグ修正(mb_b3.patch として pgsql-jp ML にリリース，
	本家では 6.4 snapshot に取り込まれる予定)	

  1998/5/18 機能追加／バグ修正(mb_b2.patch として pgsql-jp ML にリリース，
	本家では 6.4 snapshot に取り込まれる予定)
	* 環境変数 PGCLIENTENCODING のサポート．フロントエンド側の
	  エンコーディングを指定する．現在，SJIS, EUC_*, MULE_INTERNAL, 
	  LATIN1 が指定できる．また，
	  set client_encoding to 'sjis';
	  でも可能
	* 8bit 文字が渡ると問題が起きる箇所にできるだけ対応

  1998/4/21 機能追加／バグ修正(mb_b1.patch として pgsql-jp ML にリリース，
	本家では 6.4 snapshot に取り込まれている)
	* character_length(), position(), substring() のマルチバイト
	  対応
	* octet_length() 追加 → initdb のやり直し必要
	* configure のオプションに MB サポート追加
	  (ex. configure --with-mb=EUC_JP)
	* EUC_KR の regression test 追加
	  ("Soonmyung. Hong" <hong@lunaris.hanmesoft.co.kr> さん提供)
	* EUC_JP の regression test に character_length(), position(),
	  substring(), octet_length() 追加
	* regress.sh の SystemV における非互換性修正
	* toupper(), tolower() に 8bit 文字が渡ると落ちることが
	  あるのを修正

  1998/3/25 PostgreSQL 6.3.1 リリース，MB PL2 が取り込まれる

  1998/3/10 PL2 をリリース
	* EUC_JP, EUC_CN, MULE_INTERNAL の regression test を追加
	  (EUC_CN のデータは he@sra.co.jp さん提供)
	* regexp において，isalpha などに unsigend char 以外の値が
          渡らないようにガードをかける
	* 英語のドキュメントを追加
	* MB を定義しない場合に発生するバグを修正

  1998/3/1 PL1 をリリース

以上．
