goodbyegangsterのブログ

備忘録的な

Aurora PostgreSQLの照合順序(言語のロケール)とタイムゾーンの設定

Aurora PostgreSQLでは、デフォルトの照合順序(言語のロケール)とタイムゾーンの設定が日本での利用に最適化されていません。デフォルトでは、以下のようになっています。バージョンは、9.6.9です。

sample=> \l
                                     List of databases
   Name    |   Owner    | Encoding |   Collate   |    Ctype    |     Access privileges
-----------+------------+----------+-------------+-------------+---------------------------
 postgres  | masteruser | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 sample    | masteruser | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | rdsadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin              +
           |            |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | masteruser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/masteruser            +
           |            |          |             |             | masteruser=CTc/masteruser
sample=> show timezone;
 TimeZone
----------
 UTC
(1 row)

これを日本で利用する場合にあわせて最適化します。


DB Cluster Parametergroupを、以下の値に変更します。

パラメータ名 デフォルト値 設定値
lc_monetary ja_JP.UTF-8
lc_numeric ja_JP.UTF-8
lc_time ja_JP.UTF-8
timezone UTC Asia/Tokyo
datestyle iso, ymd

ロケール設定値の意味は下記の通りです。

  • LC_COLLATE
    • 文字列の並び換え順
  • LC_CTYPE
    • 文字の分類(文字とはどんなもの?大文字小文字を区別しない?)
  • LC_MESSAGES
    • メッセージの言語
  • LC_MONETARY
    • 通貨書式
  • LC_NUMERIC
    • 数字の書式
  • LC_TIME
    • 日付と時刻の書式

メッセージは英文の方が検索しやすいので、上の例では変更していません。下記は公式のマニュアル。

23.1. ロケールのサポート

datestyle の値はデフォルトでは、 iso, myd となっています。ISO書式になっているから問題ないけど、より正しい iso, ymd に変更しておきます。


LC_COLLATELC_CTYPE の値は、パラメターグループからは変更できません。DB作成時の指定しなければならないので、DBを作り直す必要があります。以下のCREATE DBコマンドにて、DBを作成してください。

postgres=> create database sample owner 'masteruser' encoding 'UTF8' lc_collate 'ja_JP.UTF-8' lc_ctype 'ja_JP.UTF-8' template 'template0';
CREATE DATABASE

下記は、参考となるAWS Forumの投稿です。

https://forums.aws.amazon.com/thread.jspa?threadID=228524


最後に確認してみます。

postgres=> \l
                                     List of databases
   Name    |   Owner    | Encoding |   Collate   |    Ctype    |     Access privileges
-----------+------------+----------+-------------+-------------+---------------------------
 postgres  | masteruser | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 sample    | masteruser | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | rdsadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin              +
           |            |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | masteruser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/masteruser            +
           |            |          |             |             | masteruser=CTc/masteruser
(5 rows)
 show timezone;
  TimeZone
------------
 Asia/Tokyo
(1 row)

ちゃんと変更できましたね。