先日、 OSC2019 Hiroshima で PostgreSQL の Explainを使って Indexを貼る前・貼った後の速度計測をする
というデモの環境を構築しました。
その時、Localeの初期値が C じゃなかったので お? と思い、調べてみました。
結論を先に
POSTGRES_INITDB_ARGS に "--encoding=UTF-8 --locale=C" を設定する
docker-compose.yml とかだと以下のように設定すると有効化されます。
version: "3.7" services: postgres: image: postgres:11 environment: POSTGRES_DB: osc_demo POSTGRES_USER: osc_user POSTGRES_PASSWORD: osc_pass POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C" ports: - "5432:5432" volumes: - ./postgres/data:/var/lib/postgresql/data - ./postgres/work:/docker-entrypoint-initdb.d/ container_name: osc_pgsql
ということで、以下は興味のある方向け〜。
課題
Dockerで自動で作られる データベースの デフォルトの Locale が C ではない。
Locale C、ja_JP.UTF-8、en_US.UTF-8の違いについては以下記事をご参照ください。
調査概要
Locale がデフォルトだと何になるか
osc_demo テーブルを作るように Docker に予め設定した状態で Docker で postgresql を立ち上げてみた。
# psql -U osc_user osc_demo psql (11.5 (Debian 11.5-1.pgdg90+1)) Type "help" for help. osc_demo=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- osc_demo | osc_user | UTF8 | en_US.utf8 | en_US.utf8 | postgres | osc_user | UTF8 | en_US.utf8 | en_US.utf8 | template0 | osc_user | UTF8 | en_US.utf8 | en_US.utf8 | =c/osc_user + | | | | | osc_user=CTc/osc_user template1 | osc_user | UTF8 | en_US.utf8 | en_US.utf8 | =c/osc_user + | | | | | osc_user=CTc/osc_user (4 rows)
未指定だと PostgreSQL の Locale は en_US.utf8 が設定される。
設定方法
POSTGRES_INITDB_ARGS
に initdb にわたす時に必要な コマンドを渡す。
参考にしたのは上記ページ
How to extend this image
の所に記述があった。
通常の時(これは Linux等のサーバーに構築する時) はどうしてるかというのは 以下のページとかを読んだ。
https://www.kaisekisya.net/linux/postgresql/eleven.html
再度 調整..
※ 元々 - ./postgres/data:/var/lib/postgresql/data
でマウントして 永続化を行っていたので ./postgres/data
の下を削除して 予め初期化しておく。
# psql -U osc_user osc_demo psql (11.5 (Debian 11.5-1.pgdg90+1)) Type "help" for help. osc_demo=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- osc_demo | osc_user | UTF8 | C | C | postgres | osc_user | UTF8 | C | C | template0 | osc_user | UTF8 | C | C | =c/osc_user + | | | | | osc_user=CTc/osc_user template1 | osc_user | UTF8 | C | C | =c/osc_user + | | | | | osc_user=CTc/osc_user (4 rows)
Locale C が設定された \(^o^)/