こんにちは!AWS事業本部のおつまみです。
みなさん、Aurora PostgreSQLのロケールをデフォルトから変更思ったことはありますか?私はあります。
PostgreSQLからAurora PostgreSQLへの移行に伴い、ロケールをデフォルトから変更する必要がありました。
変更際に留意するポイントがあったため、方法を共有したいと思います!
いきなり結論
- Aurora PostgreSQLのパラメータグループでは全てのロケール設定を変更することができない。
- パラメータグループでは、
lc_messages
,lc_monetary
,lc_numeric
,lc_time
のみ変更できる。 lc_collate
,lc_ctype
はCREATE 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_ctype
がja_JP.UTF-8
になっていることを確認できました。
なお注意点として、インスタンス作成時にDBを作成した場合は、lc_collate
,lc_ctype
がデフォルトのままになっています。
そのため、このデータベースは使用せず、新規に作成する必要があります。
さいごに
今回はAurora PostgreSQLのロケールをデフォルトから変更する方法をお伝えしました。
最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。
以上、おつまみ(@AWS11077)でした!
参考資料
Aurora PostgreSQL でサポートされる照合 - Amazon Aurora
RDS for PostgreSQLのロケールをCにする | DevelopersIO
Aurora PostgreSQLの照合順序(言語のロケール)とタイムゾーンの設定 - goodbyegangsterのブログ