PostgreSQL(ロケール)

ロケール

ロケールの設定を行うと、文字列処理、日付や通貨の書式、メッセージの言語などを 変更できる。

ロケールをサポートしない C ロケール(--locale=C と --no-locale は同じ)以外に 設定すると不具合が生じる場合がある。

設定と確認

文字列の並び換え順(lc_collate)と文字の分類(lc_ctype)は、データベース・ クラスタ初期化(initdb)時とデータベース作成時のみ設定出来る。後からの変更 は出来ない。

C ロケール(--locale=C または --no-locale)以外にする場合、エンコーディング とロケールは一致しなければならない。

・データベース・クラスタ初期化(initdb)時

設定項目は、全てのロケール

    [postgres]$ initdb --encoding=UTF-8 --no-locale --data-checksums
    [postgres]$ initdb --encoding=UTF-8 --locale=ja_JP.UTF-8 --data-checksums

    確認
    DB=> select name, setting, context from pg_settings where name like 'lc%';
name (ロケール名) setting (設定) context (設定変更)
lc_collate C internal(変更出来ない)文字列の並び換え順
lc_ctypeCinternal(変更出来ない)文字の分類
lc_messagesCsuperuser(管理者)メッセージの言語
lc_monetaryCuser(一般ユーザー)通貨書式
lc_numericCuser(一般ユーザー)数値書式
lc_timeCuser(一般ユーザー)日付/時刻の書式
・データベース作成時

設定項目は、全てのロケール

    [user]$ createdb -U ユーザー名 データベース名
                    --encoding=UTF-8 --locale=ja_JP.UTF-8 --template=template0

    確認
    DB=> \l
データベース一覧
名前 所有者 エンコーディング 照合順序 Ctype (変換演算子)
postgrespostgresUTF8CC
template0postgresUTF8CC
dbname username UTF8 ja_JP.UTF-8 ja_JP.UTF-8
・設定ファイル(/usr/local/pgsql/data/postgresql.conf)

設定項目は、lc_messages, lc_monetary, lc_numeric, lc_time

    [root]# vim /usr/local/pgsql/data/postgresql.conf

      lc_messages = 'C'   # メッセージの言語
      lc_monetary = 'C'   # 通貨書式
      lc_numeric = 'C'   # 数値書式
      #lc_time = 'C'   # 日付/時刻の書式
      lc_time = 'ja_JP.UTF-8'

    [root]# systemctl reload-or-restart postgresql.service

    確認
    DB=> select name, setting, context from pg_settings where name like 'lc%';
namesettingcontext
lc_collateCinternal
lc_ctypeCinternal
lc_messagesCsuperuser
lc_monetaryCuser
lc_numericCuser
lc_timeja_JP.UTF-8user
・SQL 文
    DB=> set  LC_TIME = 'ja_JP.UTF-8';   # 日付/時刻の書式

    確認
    DB=> show lc_time;

       lc_time
    ------------------
     ja_JP.UTF-8

    DB=> select to_char( current_timestamp, 'MM/DD(TMDy)' ) as today;

       today
    ----------------
     08/06(土)

    Perl
    my $sql = "set LC_TIME = 'ja_JP.UTF-8';";   # 日付/時刻の書式
    $sql   .= " select to_char( 列名, 'MM/DD(TMDy)' ) as 別名 from テーブル";