無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

22.1. ロケールのサポート

ロケール のサポートはアルファベット、並び換え、数字の書式など文化的嗜好を配慮したあるアプリケーションを対象にします。 PostgreSQL は、サーバのオペレーティングシステムが提供する、標準ISO Cと POSIX のロケール機能を使用します。 これ以上の情報についてはお使いのシステムのドキュメントを参照ください。

22.1.1. 概要

ロケールのサポートは、 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 がこれらのカテゴリにあてはまります。 これらはインデックスのソート順に影響を及ぼすため、固定されていなければなりません。 さもないと、テキスト型の列上のインデックスは破壊されるでしょう。 (しかし 項22.2 内で述べられているように、照合を使用することで、この制限を緩和することができます) initdb が実行された時に、これらのカテゴリのデフォルト値は決定され、 CREATE DATABASE コマンドで他を指定しない限り、新しいデータベースが作成されるときにこの値が使用されます。

その他のロケールカテゴリは、いつでも、ロケールカテゴリと同じ名前の実行時パラメータを設定することで、希望値に変更することができます (詳細は 第18章 を参照してください)。 initdb で選択された値は、実際のところ、サーバの起動時にデフォルトとして動作するように postgresql.conf 設定ファイルに書き込まれるだけです。 この代入文を postgresql.conf で削除すると、サーバは実行環境の設定をそのまま使用します。

サーバのロケールの動作はどのクライアントの環境にも依存せず、サーバが参照できる環境変数で決まります。 ですからサーバを稼動させる前に正しいロケール設定を行うように注意してください。 結果としてサーバとクライアントで異なるロケールが設定されていると、メッセージはそれらがどこから生じたかによって、異なる言語で表示されます。

注意: 実行環境のロケールをそのまま使用するということは、ほとんどのオペレーションシステムでは次のような意味を持ちます。 指定されたロケールカテゴリ(例えば照合)について、設定するものが見つかるまで、以下の環境変数がこの順番で調べられます。 LC_ALL LC_COLLATE (またはそれぞれのカテゴリに対応する変数)、 LANG 。 これらのいずれの環境変数も設定されない場合に、ロケールはデフォルトで C に設定されます。

メッセージの言語を設定する目的で、メッセージ多言語化ライブラリの中には全てのロケール設定を上書きする環境変数 LANGUAGE を検索するものがあります。 お使いのシステムでの挙動が不明ならばより詳細な情報を得るためお使いのオペレーティングシステムの文書、特に gettext の文書を参照してください。

ユーザの選択した言語にメッセージを翻訳できるようにするためには NLS を構築時に有効にする( configure --enable-nls )必要があります。 他のロケールサポートはすべて自動的に構築されます。

22.1.2. 動作

ロケールの設定は以下のSQL機能に影響を与えます。

  • 文字列データに対する ORDER BY または標準の比較演算子を使用した問い合わせにおける並び替え順

  • upper lower initcap 関数

  • ( LIKE SIMILAR TO やPOSIX形式の正規表現といった)パターンマッチング演算子では ロケールは大文字、小文字を区別せず正規表現の文字クラスによる文字の区別に影響を及ぼします。

  • 一群の to_char 関数

  • LIKE 節が付いたインデックスを使用する性能

C POSIX 以外で、 PostgreSQL でロケールを使用する際の欠点は実行速度です。 ロケールは文字の扱いを遅くし、さらに LIKE で通常のインデックスが使用されなくなります。この理由から、本当に必要な時のみロケールを使用してください。

C以外のロケールにおいて、 PostgreSQL LIKE 句を持つインデックスを使用できるようにする回避方法として、いくつかのカスタム演算子クラスがあります。 これらを用いると、文字と文字を厳密に比較するようなインデックスや、ロケールの比較規則を無視するようなインデックスを作成できます。 詳細は 項11.9 を参照してください。 もうひとつの方法は、 項22.2 内で解説されているような C 照合を使用してインデックスを作成することです。

22.1.3. 問題点

上記の説明に従ってロケールのサポートが正常に動作しない場合、オペレーティングシステムのロケールサポートが正確に設定されているか確認してください。 指定されたロケールがインストールされているかどうか確認するために、オペレーティングシステムが提供していれば、 locale -a コマンドを使用することができます。

PostgreSQL が想定しているロケールを実際に使用しているかどうかを確認してください。 LC_COLLATE LC_CTYPE の設定はデータベース作成時に決定され、新しいデータベースを作成する方法以外に変更することはできません。 LC_MESSAGES LC_MONETARY など他のロケール設定はサーバ起動時の環境変数によって初めに決定されますが、その場で変更することができます。 SHOW コマンドを使用して、使用中のロケール設定を確認することができます。

ソース配布物の src/test/locale ディレクトリには、 PostgreSQL のロケールサポート用の試験一式があります。

エラーメッセージ内のテキストを解析してサーバ側のエラーを扱っているクライアントアプリケーションでは、サーバのメッセージが異なる言語で記載されると、明らかに問題になります。 こうしたアプリケーションの作者には、エラーコードスキーマで代替させることを推奨します。

メッセージ翻訳のカタログのメンテナンスには PostgreSQL に選択した言語を話させてみたいという数多くのボランティアのたゆみのない努力を必要としています。 もしあなたの言語が現在使えなかったり完全に翻訳されてない場合、助力をよろしくお願いします。 もし助力頂けるのであれば、 第50章 を参照するか開発グループのメーリングリストに投稿してください。


powered by SEO.CUG.NET