ロケールのサポートはアルファベット、並び換え、数字の書式など文化的嗜好を配慮したアプリケーションを対象にします。 PostgreSQLは、サーバのオペレーティングシステムが提供する、標準ISO CとPOSIXのロケール機能を使用します。 これ以上の情報についてはお使いのシステムのドキュメントを参照ください。
ロケールのサポートは、initdb
を使用してデータベースクラスタを作成する時自動的に初期化されます。
initdb
は、デフォルトでその実行環境のロケール設定に従ってデータベースクラスタを初期化します。
そのため、システムがデータベースクラスタで使用したいロケールを使用するように既に設定してある場合は何も行う必要はありません。
違うロケールを使用したい場合(またはシステムのロケール設定が不明な場合)は、initdb
の--locale
オプションで希望のロケールを指定することができます。
以下に例を示します。
initdb --locale=sv_SE
Unixシステム用のこの例の設定はロケールをスウェーデン(SE
)で使用されているスウェーデン語(sv
)に合わせています。
他にもen_US
(米国英語)やfr_CA
(カナダのフランス語)などの設定もできます。
ロケールに複数の文字セットが使用可能であれば、language_territory.codeset
のように記述することができます。
例えば、fr_BE.UTF-8
はベルギー(BE)で使用されているフランス語(fr)でUTF-8の文字セットを表します。
お使いのシステムでどのロケールがどういう名前で使えるかはオペレーティングシステムのベンダがどのようなものを提供しているかと、何がインストールされているかに依存します。
ほとんどのUnixシステムでは、locale -a
というコマンドで利用可能なロケールの一覧を入手することができます。
Windowsは、German_Germany
やSwedish_Sweden.1252
のようなもっと冗長なロケール名を使用しますが、原理は同じです。
英語の照合順序規則でスペイン語のメッセージを使用する時など、時として複数のロケールの規則を併用すると便利です。 これをサポートするために、ロケールには以下のような多言語対応規則の特定の箇所だけを管理する一連のサブカテゴリがあります。
LC_COLLATE | 文字列の並び換え順 |
LC_CTYPE | 文字の分類(文字とはどんなもの?大文字小文字を区別しない?) |
LC_MESSAGES | メッセージの言語 |
LC_MONETARY | 通貨書式 |
LC_NUMERIC | 数字の書式 |
LC_TIME | 日付と時刻の書式 |
これらのカテゴリの名前は、特定のカテゴリについてのロケールの選択を上書きするためのinitdb
オプションの名前としてそのまま使用できます。
例えば、ロケールをカナダのフランス語に設定しながら通貨書式については米国の規則を使用するには、initdb --locale=fr_CA --lc-monetary=en_US
とします。
システムがロケールをサポートしていないように動作させたい場合は、特別なロケールのC
、もしくは同等なPOSIX
を使用してください。
一部のロケールカテゴリでは、その値がデータベース生成時に固定されていなければならないものがあります。
他のデータベースで他の設定を使用することができますが、一度データベースが生成されると、そのデータベースでは変更することができません。
LC_COLLATE
とLC_CTYPE
がこれらのカテゴリにあてはまります。
これらはインデックスのソート順に影響を及ぼすため、固定されていなければなりません。
さもないと、テキスト型の列上のインデックスは破壊されるでしょう。
(しかし23.2内で述べられているように、照合順序を使用することで、この制限を緩和することができます)
initdb
が実行された時に、これらのカテゴリのデフォルト値は決定され、CREATE DATABASE
コマンドで他を指定しない限り、新しいデータベースが作成されるときにこの値が使用されます。
その他のロケールカテゴリは、いつでも、ロケールカテゴリと同じ名前の実行時パラメータを設定することで、希望値に変更することができます
(詳細は第19章を参照してください)。
initdb
で選択された値は、実際のところ、サーバの起動時にデフォルトとして動作するようにpostgresql.conf
設定ファイルに書き込まれるだけです。
この代入文をpostgresql.conf
から削除すると、サーバは実行環境の設定をそのまま使用します。
サーバのロケールの動作はどのクライアントの環境にも依存せず、サーバが参照できる環境変数で決まります。 ですからサーバを稼動させる前に正しいロケール設定を行うように注意してください。 結果としてサーバとクライアントで異なるロケールが設定されていると、メッセージはそれらがどこから生じたかによって、異なる言語で表示されます。
実行環境のロケールをそのまま使用するということは、ほとんどのオペレーティングシステムでは次のような意味を持ちます。
指定されたロケールカテゴリ(例えば照合順序)について、設定するものが見つかるまで、以下の環境変数がこの順番で調べられます。LC_ALL
、LC_COLLATE
(またはそれぞれのカテゴリに対応する変数)、LANG
。
これらのいずれの環境変数も設定されない場合に、ロケールはデフォルトでC
に設定されます。
メッセージの言語を設定する目的で、メッセージ多言語化ライブラリの中には全てのロケール設定を上書きする環境変数LANGUAGE
を検索するものがあります。
お使いのシステムでの挙動が不明ならばより詳細な情報を得るためお使いのオペレーティングシステムの文書、特にgettextの文書を参照してください。
ユーザの選択した言語にメッセージを翻訳できるようにするためにはNLSを構築時に有効にする(configure --enable-nls
)必要があります。
他のロケールサポートはすべて自動的に構築されます。
ロケールの設定は以下のSQL機能に影響を与えます。
C
やPOSIX
以外で、PostgreSQLでロケールを使用する際の欠点は実行速度です。
ロケールは文字の扱いを遅くし、さらにLIKE
で通常のインデックスが使用されなくなります。この理由から、本当に必要な時のみロケールを使用してください。
C以外のロケールにおいて、PostgreSQLがLIKE
句を持つインデックスを使用できるようにする回避方法として、いくつかのカスタム演算子クラスがあります。
これらを用いると、文字と文字を厳密に比較するようなインデックスや、ロケールの比較規則を無視するようなインデックスを作成できます。
詳細は11.9を参照してください。
もうひとつの方法は、23.2内で解説されているようなC
照合順序を使用してインデックスを作成することです。
上記の説明に従ってロケールのサポートが正常に動作しない場合、オペレーティングシステムのロケールサポートが正確に設定されているか確認してください。
指定されたロケールがインストールされているかどうか確認するために、オペレーティングシステムが提供していれば、locale -a
コマンドを使用することができます。
PostgreSQLが想定しているロケールを実際に使用しているかどうかを確認してください。
LC_COLLATE
とLC_CTYPE
の設定はデータベース作成時に決定され、新しいデータベースを作成する方法以外に変更することはできません。
LC_MESSAGES
やLC_MONETARY
など他のロケール設定はサーバ起動時の環境変数によって初めに決定されますが、その場で変更することができます。
SHOW
コマンドを使用して、使用中のロケール設定を確認することができます。
ソース配布物のsrc/test/locale
ディレクトリには、PostgreSQLのロケールサポート用の試験一式があります。
エラーメッセージ内のテキストを解析してサーバ側のエラーを扱っているクライアントアプリケーションでは、サーバのメッセージが異なる言語で記載されると、明らかに問題になります。 こうしたアプリケーションの作者には、エラーコードスキームで代替させることを推奨します。
メッセージ翻訳のカタログのメンテナンスにはPostgreSQLに選択した言語を話させてみたいという数多くのボランティアのたゆみのない努力を必要としています。 もしあなたの言語が現在使えなかったり完全に翻訳されてない場合、助力をよろしくお願いします。 もし助力頂けるのであれば、第54章を参照するか開発グループのメーリングリストに投稿してください。