Oracle Linux上のPostgreSQLでデータベースを作成する際に発生するロケールエラーの対処法：invalid locale name: "ja_JP.utf8"

## アジェンダ
1 はじめに
2 環境説明及び前提条件
3 エラーの確認：invalid locale name: "ja_JP.utf8"
4 エラーの対処法
5 まとめ

## 1 はじめに
こんにちは、NTTデータ先端技術の陰です。
今回は、Oracle Linux上のPostgreSQL（PSQL）で日本語の入力ができるデータベースを作成する際に発生するロケールエラー（invalid locale name: "ja_JP.utf8"）の対処法について紹介します。

## 2 環境説明及び前提条件
今回、作業を実施する環境情報及び前提条件は以下の通りです。

##### 環境情報
OSイメージ：Oracle-Linux-8.7
リージョン：ap-tokyo-1 (日本東部(東京))
データベース：PostgreSQL 13.9

##### 前提条件
①シェル・ターミナル・コンソールがセットアップされていること
②インスタンスが作成されていること
③インスタンスにSSH接続できること
④インスタンスからインタネットにアクセスできること
⑤PostgreSQLがインストールされデータベースが初期化されていること

## 3 エラーの確認：invalid locale name: "ja_JP.utf8"
PSQL上で日本語の入力ができるようにja_JP.UTF-8ロケールを指定しデータベースを作成するとエラーが発生する場合があります。
```:実行コマンド&出力ログ
postgres=# CREATE DATABASE pgtest WITH ENCODING='UTF8' LC_COLLATE='ja_JP.utf8' LCC_CTYPE='ja_JP.utf8' OWNER=pgtest TEMPLATE=template0;

ERROR:  invalid locale name: "ja_JP.utf8"
```
上記のエラーはOS上にja_JP.UTF-8ロケールがインストールされてないことが原因で発生するエラーになります。

OS上で現在使用可能なロケールを確認するとja_JP.utf8がインストールされてないことがわかります。

```:実行コマンド&出力ログ
$ locale -a
C
C.utf8
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE@euro
en_IE.utf8
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US@ampm
en_US.iso885915
en_US.utf8
en_US.utf8@ampm
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8
POSIX
```

## 4 エラーの対処法
エラーを解決しデータベースを作成するためにはOS上にja_JP.UTF-8ロケールをインストールする必要があります。

まず、ja_JP.UTF-8ロケールをインストールする前に必要なパッケージをインストールします。
```:実行コマンド
$ sudo yum -y install glibc-locale-source
```

パッケージのインストール後、ja_JP.UTF-8ロケールをインストールします。
```:実行コマンド
$ sudo localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
```

ja_JP.UTF-8ロケールがインストールされていることを確認します。
```:実行コマンド&出力ログ
$ locale -a
C
C.utf8
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE@euro
en_IE.utf8
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US@ampm
en_US.iso885915
en_US.utf8
en_US.utf8@ampm
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8
ja_JP.utf8
POSIX
```

インストール完了後、追加したja_JP.utf8ロケールがPSQLに反映されるためにPSQLを再起動します。
```:実行コマンド
$ sudo systemctl restart postgresql-13
```

PSQLの再起動まで完了した状態であればPSQLでのデータベース作成は成功します。

```:実行コマンド&出力ログ
postgres=# CREATE DATABASE pgtest WITH ENCODING='UTF8' LC_COLLATE='ja_JP.utf8' LCC_CTYPE='ja_JP.utf8' OWNER=pgtest TEMPLATE=template0;
CREATE DATABASE
postgres=# 
postgres=# 
postgres=# \l
                                   List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+------------------
-----
 pgtest    | pgtest   | UTF8     | ja_JP.utf8  | ja_JP.utf8  | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres    
```

## 5 まとめ
今回は、Oracle Linux上のPSQLで日本語の入力ができるデータベースを作成する際に発生するロケールエラー（invalid locale name: "ja_JP.utf8"）の対処法について紹介しました。
Oracle-Linux-8.7の初期状態ではja_JP.utf8ロケールがインストールされてないのでPSQLで日本語の入力ができるデータベースを作成するためには追加でja_JP.utf8ロケールをインストールしなければならないことに注意してください。