Docker
Docker PostgreSQL 將數據庫編碼更改為 UTF-8
我想通過 docker-compose 執行一個具有 COLLATE 和 CTYPE ‘C’ 以及數據庫編碼 ‘UTF-8’ 的 postgres 容器。但這看起來是不可能的。
這是 docker-compose.yml 上的部分:
database: image: postgres:latest volumes: - db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: test LC_COLLATE: C LC_CTYPE: C LANG: C.UTF-8
這是日誌輸出:
The database cluster will be initialized with locales. The default text search configuration will be set to "english". COLLATE: C CTYPE: C MESSAGES: C.UTF-8 MONETARY: C.UTF-8 NUMERIC: C.UTF-8 TIME: C.UTF-8 The default database encoding has accordingly been set to "SQL_ASCII".
我必須在 UTF-8 中使用數據庫編碼,在“C”而不是“C.UTF-8”中使用 COLLATE 和 CTYPE,否則依賴應用程序無法連接。
我在任何文件或其他任何地方都沒有找到任何東西。
您需要在這里合併兩個拼圖:
https://www.postgresql.org/docs/9.5/app-initdb.html
initdb,教你如何將編碼資訊傳遞給數據庫創建函式。
postgres 官方 Docker 映像聲明您可以將選項傳遞給 initdb:
https://hub.docker.com/_/postgres
因此,答案將類似於:
database: image: postgres:latest volumes: - db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: test POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'
或類似的論點。我忽略了 lang 選項,因為這不是手冊頁上的官方“將此標誌傳遞給 postgres”選項(我包含的第一個連結)。
我的測試沒有使用 docker compose 執行它,它是在命令行上使用 -e 選項。然而,這是完全相同的概念;docker compose 中的“環境”是命令行上的 -e 。以機智:
https://docs.docker.com/engine/reference/commandline/run/
–env , -e 設置環境變數
僅設置密碼環境的測試#1:
docker run -e POSTGRES_PASSWORD=test postgres:latest
這是預設執行的輸出:
postgres@cbf23636dabc:~$ psql psql (13.4 (Debian 13.4-1.pgdg100+1)) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres
測試 #2,在建議的 docker compose 中如上所述設置環境變數,僅在 CLI 上:
docker run -e POSTGRES_PASSWORD=test -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --lc-collate=C --lc-ctype=C' postgres:latest
然後輸出:
postgres@b6b80c876f3e:~$ psql psql (13.4 (Debian 13.4-1.pgdg100+1)) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres
另請注意,官方 Postgresql Docker 映像頁面上的部分描述了初始化腳本。這也是您可能會研究的問題。