Chapter 5. ローカライゼーション

Table of Contents
5.1. ロケールサポート
5.2. マルチバイトサポート
5.3. シングルバイト文字のコード再設定

管理者側として使用可能なローカライゼーションをこの章では取り扱います。

Postgresでは、ローカライゼーションを 扱うために3つの方法をサポートしています。

5.1. ロケールサポート

ロケールサポートとは、国間のアルファベットや、順序、 数形式などの違いを考慮するものです。PostgreSQLでは サーバオペレーティングシステムで提供されている標準ISO Cと POSIXに似たロケールを使用しています。これに関しての詳細は ご使用のシステムのドキュメントを参照して下さい。

5.1.1. 概要

PostgreSQLでは、ロケールのサポートはディフォルトでは 行われていません。サポートを行うには下記のように、configureを 実行する際に --enable-locale オプションを付けて下さい。

$ ./configure --enable-locale

ロケールのサポートはサーバのみに有効です。すべてのクライアントは ロケールのサポートがある/ないに拘わらず、サーバと互換性が持てます。

どの特定の規則を使用するかの情報は標準の環境変数を使用します。 他のプログラムからローカリゼーションの機能を使用している場合、 すでに設定されている可能性があります。ローカライゼーション情報の もっとも簡単な方法は、下記のようにLANG変数を 使用するものです。

export LANG=sv_SE
この例では、ロケールをスウェーデン(sv)で使用されている スウェーデン語(SE)に合わせています。他にも en_US(米国英語)やfr_CA(カナダのフランス語) などの設定も行えます。ロケールに1つ以上の文字が使用可能で あるならば、cs_CZ.ISO8859-2のように記述することが できます。ご使用のシステムで、どのロケールが何のロケール名で 使えるかは、ベンダーのオペレーティングシステムがどのようなものを 提供しているかと、何がインストールされたかによって変わってきます。

米国の照合順規則でスペイン語を使用する時など、時折、 規則を併用すると便利になる場合があります。 このためには、環境変数、LANGの特定なカテゴリの ディフォルトを書き換える必要があります。

LC_COLLATE文字列のソート順序
LC_CTYPE 文字種別(文字とは?大文字と等しいか?)
LC_MESSAGESメッセージの言語
LC_MONETARY通貨形式
LC_NUMERIC数形式
LC_TIME日時形式

LC_MESSAGESは、PostgreSQLからではなく、 オペレーティングシステムから送られてきた メッセージにのみ影響を与えます。

システムにロケールのサポートがないような動作を要求する場合は、 特別なロケールであるC、もしくはPOSIXを 使用して下さい。あるいは、ロケールに関する変数をすべて unsetしてください。

ロケールの動作は、クライアントの環境ではなく、サーバの環境変数によって 決定されることにご注意下さい。したがって、postmasterを起動させる前に 環境変数を設定して下さい。

LC_COLLATELC_CTYPE変数は、インデックスの 順序付けに影響を及ぼします。したがって、これらの値は、特定のデータベース クラスタで固定しないと、テキスト列にあるインデックスは破壊されてしまいます。 これを強制させるために、Postgresでは、 initdbコマンドによって参照されているLC_COLLATELC_CTYPEの値の記録を行っています。サーバが起動されたときに、 自動的にこれらの2つの値を適合させます。LC_カテゴリのみ サーバの起動開始時点の環境で設定できます。つまり、1つのデータベース クラスタでは1つの対照順序のみ使用可能で、それはinitdbの 時点で設定されます。

5.1.2. 利点

ロケールのサポートは下記の機能に影響を与えます。

  • ORDER BYの問い合わせのソート順

  • to_char関数の一群

  • 正規表現のLIKE~演算子

PostgreSQLでこれらのロケールサポートを 使用する際のたった1つの重大な欠点として上げられるものは、その実行速度です。 ですから、本当に必要な時のみロケールを使用して下さい。 また、C以外のロケールを使用するとLIKE~演算子のインデックス最適化が実行できなくなってしまい、 それらの演算子を使用する検索では、大きな違いをもたらします。

5.1.3. 問題点

上記の説明にしたがって設定を行ったにも拘わらず、ロケールの サポートが正常に動作しない場合、ご使用のオペレーティングシステムの ロケールサポートが正常に作動しているかの確認を行って下さい。 指定されたロケールがインストールされて、正常に作動するかの確認は、 Perlなどを使ってできます。Perlにも ロケールサポートがあり、perl -vを実行して、もし ロケールに不具合がある場合には下記のようなエラーメッセージが 表示されます。

$ export LC_CTYPE='not_exist'
$ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = (unset),
LC_CTYPE = "not_exist",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

ロケールファイルが正しい場所にあるかの確認を行って下さい。 設置場所としては、/usr/lib/locale(Linux,Solaris)、 /usr/share/locale (Linux)、 /usr/lib/nls/loc (DUX 4.0)です。 分からない場合にはmanページでロケールを参照して下さい。

src/test/localeディレクトリには PostgreSQLのロケールサポートの 一連のテストがあります。