管理者側として使用可能なローカライゼーションをこの章では取り扱います。
Postgresでは、ローカライゼーションを 扱うために3つの方法をサポートしています。
ロケールに特化した照合順序、数形式などを提供するために オペレーティングシステムのロケールの特徴を使用する。
1バイトでは表せれない文字を使用する言語をサポートするためと、 クライアントとサーバ間でコード変換を提供するために、 Postgresサーバに定義されている マルチバイト文字を使用する。サポートされる文字はサーバが コンパイルされた時に固定され、文字列の比較などの 内部オペレーションでは各文字は32ビットに拡張される必要があります。
シングルバイト文字のコード変換は、複数のシングルバイト文字セットを 使用する方が、より軽いものとなります。
ロケールサポートとは、国間のアルファベットや、順序、 数形式などの違いを考慮するものです。PostgreSQLでは サーバオペレーティングシステムで提供されている標準ISO Cと POSIXに似たロケールを使用しています。これに関しての詳細は ご使用のシステムのドキュメントを参照して下さい。
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 | 日時形式 |
システムにロケールのサポートがないような動作を要求する場合は、 特別なロケールであるC、もしくはPOSIXを 使用して下さい。あるいは、ロケールに関する変数をすべて unsetしてください。
ロケールの動作は、クライアントの環境ではなく、サーバの環境変数によって 決定されることにご注意下さい。したがって、postmasterを起動させる前に 環境変数を設定して下さい。
LC_COLLATEとLC_CTYPE変数は、インデックスの 順序付けに影響を及ぼします。したがって、これらの値は、特定のデータベース クラスタで固定しないと、テキスト列にあるインデックスは破壊されてしまいます。 これを強制させるために、Postgresでは、 initdbコマンドによって参照されているLC_COLLATEと LC_CTYPEの値の記録を行っています。サーバが起動されたときに、 自動的にこれらの2つの値を適合させます。LC_カテゴリのみ サーバの起動開始時点の環境で設定できます。つまり、1つのデータベース クラスタでは1つの対照順序のみ使用可能で、それはinitdbの 時点で設定されます。
ロケールのサポートは下記の機能に影響を与えます。
ORDER BYの問い合わせのソート順
to_char関数の一群
正規表現のLIKEと~演算子
PostgreSQLでこれらのロケールサポートを 使用する際のたった1つの重大な欠点として上げられるものは、その実行速度です。 ですから、本当に必要な時のみロケールを使用して下さい。 また、C以外のロケールを使用するとLIKEと ~演算子のインデックス最適化が実行できなくなってしまい、 それらの演算子を使用する検索では、大きな違いをもたらします。
上記の説明にしたがって設定を行ったにも拘わらず、ロケールの サポートが正常に動作しない場合、ご使用のオペレーティングシステムの ロケールサポートが正常に作動しているかの確認を行って下さい。 指定されたロケールがインストールされて、正常に作動するかの確認は、 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のロケールサポートの 一連のテストがあります。