【AWS】RDS for PostgreSQLの「Collate」と「Ctype」を「ja_JP.UTF-8」に変更してみました

#はじめに
RDS for PostgreSQL 作成後に、デフォルトの```Collate```と```Ctype```は```en_US.UTF-8```になっていますが、```en_US.UTF-8```を```ja_JP.UTF-8```に変更することが本記事の主旨です。

ちなみに、今回使用しているEC2とRDSの情報は下記となります。
・EC2： Amazon Linux 2
・RDS for PostgreSQLエンジンバージョン：12.6

#作業手順
１．postgresql接続ミドルウェアをインストールします
※バージョンはRDS postgresqlに準じてインストールすること

```
$ sudo amazon-linux-extras install epel -y
$ sudo amazon-linux-extras install postgresql12
```

２．```dbtest```DBの現状確認
下記ご覧のように、現在```dbtest```の```Collate```と```Ctype```は```en_US.UTF-8```になっています。

```
dbtest=> \l
                                      List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |      Access privileges
-----------+-------------+----------+-------------+-------------+-----------------------------
 dbtest    | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin                +
           |             |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXXXXXX             +
           |             |          |             |             | XXXXXXXXXXX=CTc/XXXXXXXXXXX
(5 rows)
```

３．```dbtest```にテスト用のデータをインポートします

```
dbtest=> CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
CREATE TABLE
dbtest=> INSERT INTO user_tbl(name, signup_date) VALUES('田中', '2021-07-26');
INSERT 0 1
dbtest=> INSERT INTO user_tbl(name, signup_date) VALUES('鈴木', '2021-07-26');
INSERT 0 1
dbtest=> INSERT INTO user_tbl(name, signup_date) VALUES('太郎', '2021-07-26');
INSERT 0 1
dbtest=> SELECT * FROM user_tbl;
 name | signup_date
------+-------------
 田中 | 2021-07-26
 鈴木 | 2021-07-26
 太郎 | 2021-07-26
(3 rows)
```

４．```dbtest```DBのDumpファイルをエクスポートします

```
[root@ip-XXX-XXX-XXX-XXX ~]# pg_dump -h <RDSエンドポイント> -U<RDSユーザネーム> <DB名> > /tmp/db_bk.dump
```

５．Dumpファイルがエクスポートされるかどうかを確認します

```
[root@ip-XXX-XXX-XXX-XXX ~]# cd /tmp
[root@ip-XXX-XXX-XXX-XXX tmp]# ll db_bk.dump
-rw-r--r-- 1 root root 1213 Jul 26 09:35 db_bk.dump
```

６．```dbtest```から```postgres```へ移動

```
dbtest=> \l
                                      List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |      Access privileges
-----------+-------------+----------+-------------+-------------+-----------------------------
 dbtest    | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin                +
           |             |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXXXXXX             +
           |             |          |             |             | XXXXXXXXXXX=CTc/XXXXXXXXXXX
(5 rows)

dbtest=> \c postgres
Password:
psql (12.7, server 12.6)
SSL connection (protocol: TLSv1.2, cipher: XXXX-XXXX-XXXX-XXXX-XXXX, bits: 256, compression: off)
You are now connected to database "postgres" as user "XXXXXXXX".
postgres=>
```
７．既存の```dbtest```を削除します

```
postgres=> DROP DATABASE dbtest;
DROP DATABASE
postgres=> \l
                                      List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |      Access privileges
-----------+-------------+----------+-------------+-------------+-----------------------------
 postgres  | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin                +
           |             |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXXXXXX             +
           |             |          |             |             | XXXXXXXXXXX=CTc/XXXXXXXXXXX
(4 rows)

postgres=>
```

８．```dbtest```を再作成します。
下記ご覧のように、```Collate```と```Ctype```は```ja_JP.UTF-8```に変更しました。

```
postgres=> CREATE DATABASE dbtest LC_COLLATE 'ja_JP.UTF-8' LC_CTYPE 'ja_JP.UTF-8' ENCODING 'UTF8' TEMPLATE template0;
CREATE DATABASE
postgres=> \l
                                      List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |      Access privileges
-----------+-------------+----------+-------------+-------------+-----------------------------
 dbtest    | XXXXXXXXXXX | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 postgres  | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin                +
           |             |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXXXXXX            +
           |             |          |             |             | XXXXXXXXXXX=CTc/XXXXXXXXXXX
(5 rows)
```

９．バックアップしたDumpファイルを上記新規作成された```dbtest```へインポートします

```
[root@ip-XXX-XXX-XXX-XXX ~]# psql --host=<エンドポイント> --username=<ユーザネーム> --password --dbname=<DB名> < /tmp/db_bk.dump
Password:
SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
COPY 3
REVOKE
REVOKE
GRANT
GRANT
```
１０．確認

```
dbtest=> \l
                                      List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |      Access privileges
-----------+-------------+----------+-------------+-------------+-----------------------------
 dbtest    | XXXXXXXXXXX | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 postgres  | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin                +
           |             |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | XXXXXXXXXXX | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/XXXXXXXXXXX             +
           |             |          |             |             | XXXXXXXXXXX=CTc/XXXXXXXXXXX
(5 rows)

dbtest=> \d
            List of relations
 Schema |   Name   | Type  |    Owner
--------+----------+-------+-------------
 public | user_tbl | table | XXXXXXXXXXX
(1 row)

dbtest=> select * from user_tbl;
 name | signup_date
------+-------------
 田中 | 2021-07-26
 鈴木 | 2021-07-26
 太郎 | 2021-07-26
(3 rows)
```

#参考資料

https://yoshinorin.net/2018/06/12/postgresql-default-collate-ctype/