Docker

Docker PostgreSQL 將數據庫編碼更改為 UTF-8

  • November 11, 2021

我想通過 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 映像頁面上的部分描述了初始化腳本。這也是您可能會研究的問題。

引用自:https://serverfault.com/questions/1074738