著者: 石井達夫 (<ishii@postgresql.org>), 2000-03-22. 詳細は石井達夫の ウェブページを参照して下さい。
マルチバイト(MB)サポートは、 PostgresでEUC (Extended Unix Code)や Unicode、Mule内部コードなどのマルチバイト文字を扱えるようにしているものです。 MBを使用することによって、正規表現(regexp)や LIKE、いくつかの関数でマルチバイト文字を使用できるようになります。 initdbを使ってPostgresを 初期化する際に、ディフォルトのエンコーディングシステムが設定されます。また、 この設定は、SQLコマンド、CREATE DATABASEやcreatedbで データベースを作成する際に変更することができます。したがって、 データベース毎に異ったマルチバイトのエンコーディングシステムを使用することが できます。
また、MBは、ISO8859を含む8ビットのシングルバイト文字セットに ある問題の一部を修正します。(すべての問題を解決するわけではありません。 リグレションテストでは成功し、また、フランス語文字の一部がパッチを 使用することによって受けつけられることを意味しています。8バイト文字を 使用して問題が生じる場合はご一報下さい。)
コンフィギュアを行う際に、マルチバイトオプションを付けて下さい。
% ./configure --enable-multibyte[=encoding_system]この際、encoding_systemには 下記のものを当てはめることができます。
Table 5-1. Postgres 文字エンコーディング設定
エンコーディング | 説明 |
---|---|
SQL_ASCII | ASCII |
EUC_JP | 日本語 EUC |
EUC_CN | 中国語 EUC |
EUC_KR | 韓国語 EUC |
EUC_TW | 台湾で使われている EUC |
UNICODE | ユニコード(UTF-8) |
MULE_INTERNAL | Mule 内部コード |
LATIN1 | ISO 8859-1 の英語と、ヨーロッパ言語の一部 |
LATIN2 | ISO 8859-2 の英語と、ヨーロッパ言語の一部 |
LATIN3 | ISO 8859-3 の英語と、ヨーロッパ言語の一部 |
LATIN4 | ISO 8859-4 の英語と、ヨーロッパ言語の一部 |
LATIN5 | ISO 8859-5 の英語と、ヨーロッパ言語の一部 |
KOI8 | KOI8-R(U) |
WIN | Windows CP1251 |
ALT | Windows CP866 |
下記は、ディフォルトで日本語のエンコーディングを使用するように Postgresのコンフィギュアをする例です。
% ./configure --enable-multibyte=EUC_JP
エンコーディングシステムが略された場合 (./configure --enable-multibyte)には、 SQL_ASCIIが使用されます。
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)
Postgresでは、バックエンドと フロントエンド間での自動エンコーディング変換をいくつかの エンコーディングに対してサポートしています。
Table 5-2. Postgresクライアント/サーバ文字エンコーディング設定
サーバ側エンコーディング | 利用可能なクライアントエンコーディング |
---|---|
EUC_JP | EUC_JP, SJIS |
EUC_TW | EUC_TW, BIG5 |
LATIN2 | LATIN2, WIN1250 |
LATIN5 | LATIN5, WIN, ALT |
MULE_INTERNAL | EUC_JP, SJIS, EUC_KR, EUC_CN, EUC_TW, BIG5, LATIN1 to LATIN5, WIN, ALT, WIN1250 |
エンコーディングの自動変換を行うには、フロントエンドではどの エンコーディングを使用するかをPostgresに 指定する必要があります。これを行うにはいくつかの方法があります。
psqlで、\encodingコマンド を使用する方法。\encodingコマンドは、 フロントエンドのエンコーディングを直ちに変更します。 例えば、エンコーディングをSJISに変更する場合は、下記のようにします。
\encoding SJIS
libpq機能を使用する方法。実際には、\encodingは PQsetClientEncoding()を呼び出しています。
int PQsetClientEncoding(PGconn *conn, const char *encoding)ここで、connとはバックエンドとの 接続を意味し、encodingは使用したい エンコーディングを意味します。エンコーディングの設定に成功するとゼロを返し、 失敗すると-1を返します。現在の接続のエンコーディングは下記を実行することによって 表示させることができます。
int PQclientEncoding(const PGconn *conn)"EUC_JP"などのエンコーディングシンボルではなく、"encoding 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がクライアントの環境で 定義されている場合、バックエンドと接続が行われたら、 そのクライアントのエンコーディングが自動的に選択されます。 (これはそれが行われた後に、上記の方法を用いて書き換えることが可能です。)
ユニコードとその他のエンコーディング間のエンコーディング自動変換は PostgreSQL 7.1からサポートされています。これを行うには、 巨大な変換テーブルが必要となるため、ディフォルトでは使用可能になっていません。 この機能を使用するには、コンフィギュアに --enable-unicode-conversion オプションを付けて下さい。 また、この時に --enable-multibyte オプションも 必要となりますので、ご注意下さい。
例えば、バックエンドにEUC_JPを使用し、フロントエンドではLATIN1を 選択していたとします。この場合、いくつかの日本語はLATIN1に変換することが できません。この場合、LATIN1で表すことができない文字は下記のように 変換されます。
(HEXA DECIMAL)
ここに記したものは様々なエンコーディングシステムを学習するためによい資料です。
ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf セクション3.2にEUC_JP、EUC_CN、EUC_KR、EUC_TWの詳細説明があります。
Unicode: http://www.unicode.org/ ユニコードのホームページ
RFC 2044 ここでUTF-8が定義されています。
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 <jonahkuo@mail.ttn.com.tw>) 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 <hong@lunaris.hanmesoft.co.kr>) * 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
Postgresでは、ロケールサポートを 使用すれば、Windowsのクライアントプラットフォームに 設定されているWIN1250文字を使うことができます。
下記のことにご注意下さい。
特定のシステムシステムロケールでの動作確認がされています。 このテストはcs_CZ.iso8859-2ロケールを使って、RH6.0と Slackware 3.6で行われています。
決してサーバのマルチバイトデータベースエンコーディングをWIN1250に 設定しないで下さい。UnixにはWIN1250ロケールが存在しないので、 必ずLATIN2を使用して下さい。
WIN1250エンコーディングはM$W ODBCクライアントでのみ使用できます。 文字はその場で変換され、正しく格納/表示されます。
稼働中には、下記のことにご注意下さい。
このコンフィギュアは、LC_xの 設定によって順序付けの順序が変更されます。リグレションテストでは ロケールを使用しないので、テスト結果に混乱させられないようにしないで下さい。
"ch"などは、使用しているシステムがその ロケールをサポートしている時のみに正確に格納されます。 比較的新しいシステム(RH6.0など)は作動しますが、古いシステムでは 作動しません。
通貨は'162,50'のように記述して下さい。 (シングルクォートの中にカンマを入れます)。
これが書かれた時点(1999年始め)では、このコンフィギュアの 十分なテストは行われていません。何かありましたらご連絡下さい。
Windows/ODBC上でのWIN1250
Postgresのコンフィギュアの際、 ロケールを可能とし、マルチバイトエンコーディングをLATIN2に して下さい。
インストールを行って下さい。使っている環境にロケール変数を 忘れずに作成して下さい。下記に例を記しますが、この設定が お使いのシステムで有効であるとは限りません。
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
ロケールを設定し、postmasterを起動させて下さい。
チェコ語で試してみて、順序付けを行ってみて下さい。
マイクロソフトマシンのPgSQLにODBCドライバをインストールして下さい。
適切なデータソースを設定して下さい。ODBCコンフィギュアダイアログの Connect Settingsのフィールドで、下記の1行を 追加して下さい。
SET CLIENT_ENCODING = 'WIN1250';
ODBCがあるWindowsで再度試してみて下さい。