Aurora PostgreSQLのロケールをデフォルトから変更してみた

Aurora PostgreSQLのパラメータグループからはlc_collate、lc_ctypeの設定はできません。CREATE DATABASEコマンドを使い、変更する必要があることに注意しましょう。
2023.10.31

こんにちは!AWS事業本部のおつまみです。

みなさん、Aurora PostgreSQLのロケールをデフォルトから変更思ったことはありますか?私はあります。

PostgreSQLからAurora PostgreSQLへの移行に伴い、ロケールをデフォルトから変更する必要がありました。
変更際に留意するポイントがあったため、方法を共有したいと思います!

いきなり結論

  • Aurora PostgreSQLのパラメータグループでは全てのロケール設定を変更することができない。
  • パラメータグループでは、lc_messages,lc_monetary,lc_numeric,lc_timeのみ変更できる。
  • lc_collate,lc_ctypeCREATE DATABASEコマンド実行時のみ変更できる。

ロケールとは?

PostgreSQLのロケールとは、特定の地理的、政治的、文化的地域の言語、通貨、時間形式といった地域設定を指します。
ロケールを設定することで、データベース操作をその地域の言語や規約に合うようにカスタマイズできます。

具体的に設定可能な項目は以下です。

  • lc_collate
    • 文字列の並べ替え順序(通常はdictionary順)と文字列比較を制御します。例えば、Cロケールではエンコーディングに依存する文字のバイナリ値を元に並び順を決めますが、日本語ロケールでは辞書順(カタカナ→ひらがな, 清音→濁音→半濁音) の順にソートされています。これらのルールは言語によります。この設定はデータベースを作成するときにのみ決定できます。
  • lc_ctype
    • 文字の分類と文字のケース変換を制御します。これは例えばlower()、upper()、そしてパターンマッチング演算子がどのように動作するかを決定します。この値もデータベース作成時に設定され、後から変更できません。
  • lc_messages
    • ユーザに通知されるエラーメッセージなど、システムメッセージの言語を制御します。この値は後から変更可能です。
  • lc_monetary
    • 通貨に関連する表示形式を制御します。これには、通貨記号、通貨の千位の区切り文字、小数点文字などが含まれます。これも後から変更可能な設定です。
  • lc_numeric
    • 数値の表示形式を制御します。これには、千位の区切り文字や小数点文字などが含まれます。これも後から変更可能な設定です。
  • lc_time
    • 日付や時刻の表示形式を制御します。これには、週の最初の日、AM/PM表示などが含まれます。これも後から変更可能な設定です。

ロケールについては、下記サイトに詳しいことが書かれているので参考にしてください。

やってみた

今回は既存PostgreSQLの設定に合わせて、以下の通り設定したいと思います。

  • 日本語ロケール
    • lc_collate,lc_ctype
  • Cロケール(ロケールを設定しない)
    • lc_messages,lc_monetary,lc_numeric,lc_time

デフォルト設定の確認

Aurora PostgreSQLのロケールを確認してみます。

まずはパラメータグループがデフォルトの状態を確認してみます。

postgres=> SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
    name     |   setting   |    context    
-------------+-------------+---------------
 lc_collate  | en_US.UTF-8 | internal
 lc_ctype    | en_US.UTF-8 | internal
 lc_messages |             | rds_superuser
 lc_monetary | C           | user
 lc_numeric  | C           | user
 lc_time     | C           | user
(6 rows)

変更してみた

パラメータグループでは、lc_messages,lc_monetary,lc_numeric,lc_timeのみ変更できます。

すべて C へ変更した状態で、再度確認してみます。

postgres=> SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';
    name     |   setting   |    context    
-------------+-------------+---------------
 lc_collate  | en_US.UTF-8 | internal
 lc_ctype    | en_US.UTF-8 | internal
 lc_messages | C           | rds_superuser
 lc_monetary | C           | user
 lc_numeric  | C           | user
 lc_time     | C           | user
(6 rows)

lc_collate,lc_ctype以外は C になりました。

lc_collate,lc_ctypeは下記の公式ドキュメントに記載されている通り、CREATE DATABASEコマンド実行時のみ変更できます。

Aurora PostgreSQL でサポートされる照合 - Amazon Aurora

CREATE DATABASEコマンドで、DB(test)を作成し、日本語ロケールを指定してみます。

postgres=> CREATE DATABASE test LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' TEMPLATE template0;
CREATE DATABASE
postgres=> \l
                                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges   
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
 rdsadmin  | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/rdsadmin          +
           |          |          |             |             |            |                 | rdsadmin=CTc/rdsadmin
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 test      | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |            | libc            | 
 initialdb   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
(6 rows)

DB(test)のlc_collate,lc_ctypeja_JP.UTF-8になっていることを確認できました。

なお注意点として、インスタンス作成時にDBを作成した場合は、lc_collate,lc_ctypeがデフォルトのままになっています。
そのため、このデータベースは使用せず、新規に作成する必要があります。

さいごに

今回はAurora PostgreSQLのロケールをデフォルトから変更する方法をお伝えしました。

最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。

以上、おつまみ(@AWS11077)でした!

参考資料

Aurora PostgreSQL でサポートされる照合 - Amazon Aurora

RDS for PostgreSQLのロケールをCにする | DevelopersIO

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

ロケール(国際化と地域化) | Let's POSTGRES