PostgreSQL は 3 種類の取り上げ方で多言語対応を支援しています。
ロケール固有の照合順序、数字の形式、翻訳されたメッセージなどを提供するためオペレーティングシステムのロケールの機能を使います。
シングルバイトで表現で可能な範囲を越える数多い文字が必要な言語の支援とクライアント・サーバ間での文字セットのコード変換を提供するため PostgreSQL サーバで定義されたマルチバイト文字セットを使用します。サポートされる文字セットの数はサーバのコンパイル時点で固定され、文字列の比較のような内部操作にはそれぞれの文字を 32 ビット語長に伸展しなければなりません。
シングルバイト文字のコード変換はシングルバイト文字セットではなくマルチバイト文字セットの利用者がより軽快に使える環境を提供します。
ロケールのサポートはアルファベット、並び換え、数字の形式など言語間の文化的嗜好を配慮したあるアプリケーションを対象にします。 PostgreSQL は標準 ISO C と POSIX に類似したサーバのオペレーティングシステム提供の利器であるロケールを使用します。追加情報はお使いのシステムのドキュメントを参照下さい。
ロケールのサポートはデフォルトで PostgreSQL に組み込まれません。組み込むためには configure スクリプトに --enable-locale オプションを付けます。
ロケールのサポートはサーバにのみ効果をもたらします。すべてのクライアントはロケールサポートの有る無しにかかわらずサーバと互換性が保たれます。ユーザーの選択した言語にメッセージを翻訳するには --enable-nls オプションを使用します。このオプションは他のロケールサポートとは独立しています。
ど特定の文化的規則を使用するかの情報は標準の環境変数で決定されます。もしほかのプログラムでローカライズされた振舞がシステムにあるとすれば、たぶんロケールは既に設定されていることでしょう。最も簡単なローカライズ情報の設定は以下のように LANG 変数を使います。
export LANG=sv_SE
この設定はロケールをスウェーデン(SE)で使用されているスウェーデン語(sv)に合わせています。ほかにも en_US(米国英語)や fr_CA(カナダのフランス語)などの設定もできます。ロケールに複数の文字セットが使用可能であれば、 cs_CZ.ISO8859-2 のように記述することができます。お使いのシステムでどのロケールがどういう名前で使えるかはオペレーティングシステムのベンダーがどのようなものを提供しているかと、何がインストールされているかに依存します。
米国の照合規則でスペイン語のメッセージを使用するときなど、時としていくつかのロケールの規則を併用すると便利です。このための環境変数として以下のようなものがあって、特定のカテゴリーについて LANG のデフォルトを上書きします。
LC_COLLATE | 文字列の並び換え順 |
LC_CTYPE | 文字の分類(文字とはどんなもの? 大文字小文字を区別しない?) |
LC_MESSAGES | メッセージの言語 |
LC_MONETARY | 通貨形式 |
LC_NUMERIC | 数字の書き方 |
LC_TIME | 日付と時刻の書き方 |
Note: メッセージの言語を設定する目的でローカリゼーションライブラリはすべてのロケール設定を上書きする環境変数 LANGUAGE を見に行きます。嘘だと思うのであればより詳細な情報を得るためお使いのオペレーティングシステムのドキュメント、特に gettext のマニュアルページを参照して下さい。
システムがロケールをサポートしていないように動作させたい場合は、特別なロケールの C、もしくは POSIX を使用するか、ロケールに関連するすべての変数を単に非設定にしてください。
サーバのロケールの動作はどのクライアントの環境にも依存せずサーバが参照できる環境変数で決まります。ですからサーバを稼働させる前にこれらの変数を設定するように注意して下さい。結果としてサーバとクライアントで異なるロケールが設定されているとメッセージはそれらがどこから生じたかよって、異なる言語で表示されます。
LC_COLLATE and LC_CTYPE 変数はインデックスの並び替え順に影響をおよぼします。ですから、これらの変数はどんな特定のデータベースクラスタに対しても固定されていなければなりません。さもないと、テキスト型列上のインデックスは破壊されます。 PostgreSQL は initdb が見れるように LC_COLLATE と LC_CTYPE の値を記録してこの事が必ず守られるようにします。サーバは起動された時点で自動的にこれらの 2 つの値を採用します。サーバの稼働時にもう一方の LC_ 範疇のみが環境から設定可能です。端的に表現すると、データベースクラスタ内ではたったひとつの照合順序が使用可能で、それは initdb 時に選択されます。
ロケールのサポートは特に以下の機能に影響を与えます。
PostgreSQL でロケールサポートを使用する際のたったひとつの重大な欠点は実行速度です。ですから、本当に必要なときのみロケールを使用してください。また、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)です。はっきりしない時はロケールのマニュアルページを参照してください。
これだと思っているロケールを PostgreSQL が実際に使用しているか確認します。 LC_COLLATE と LC_CTYPE の設定は initdb の時点で確定され、再度 initdb を実行しないと変更できません。LC_MESSAGES と LC_MONETARY を含む他のロケール設定は postmaster が起動された環境によって決まり、postmaster を単に再起動すれば変更できます。 contrib/pg_controldata ユーティリティプログラムでデータベースの LC_COLLATE と LC_CTYPE の設定を検証できます。
src/test/locale ディレクトリに PostgreSQL のロケールサポートのテスト一式があります。
サーバのメッセージが異なった言語の場合はエラーメッセージのテキストを構文解析してサーバサイドエラーを処理するクライアントアプリケーションで明らかに問題となります。もしそのようなアプリケーションを作成するのであればこの状況に対処する方法を工夫しなければなりません。組み込み SQL インターフェイスの (ecpg) もこの問題の影響を受けます。今のところ ecpg アプリケーションとインターフェイスをとるサーバはメッセージを英語で送るようにコンフィギュレーションするようにお勧めします。
メッセージ翻訳のカタログのメンテナンスには PostgreSQL に選択した言語を話させてみたいという数多くのボランティアのたゆみのない努力を必要としています。もしあなたの言語が現在使えなかったり完全に翻訳されない場合あなたの助力を感謝します。もし助力いただけるのであれば開発者ガイドを参照するか開発グループのメーリングリストに投稿して下さい。