Điểm:1

Docker PostgreSQL thay đổi mã hóa cơ sở dữ liệu thành UTF-8

lá cờ in

Tôi muốn chạy qua docker-compose một thùng chứa postgres có COLLATE và CTYPE 'C' và mã hóa cơ sở dữ liệu 'UTF-8'. Nhưng điều này có vẻ là không thể.

Đây là phần trên docker-compose.yml:

cơ sở dữ liệu:
    hình ảnh: postgres: mới nhất
    khối lượng:
        - db:/var/lib/postgresql/data
    môi trường:
        POSTGRES_PASSWORD: kiểm tra
        LC_COLLATE: C
        LC_CTYPE: C
        LANG: C.UTF-8

Và đây là đầu ra nhật ký:

Cụm cơ sở dữ liệu sẽ được khởi tạo với các ngôn ngữ.
Cấu hình tìm kiếm văn bản mặc định sẽ được đặt thành "tiếng Anh".
  THU THẬP: C
  LOẠI: C
  THÔNG ĐIỆP: C.UTF-8
  TIỀN TỆ: C.UTF-8
  SỐ: C.UTF-8
  THỜI GIAN: C.UTF-8
Theo đó, mã hóa cơ sở dữ liệu mặc định đã được đặt thành "SQL_ASCII".

Tôi phải có mã hóa cơ sở dữ liệu ở dạng UTF-8 và COLLATE và CTYPE ở dạng 'C' và không phải 'C.UTF-8' nếu không thì ứng dụng phụ thuộc không thể kết nối.

Tôi không tìm thấy bất cứ điều gì trong bất kỳ tài liệu nào hoặc bất cứ nơi nào khác.

Điểm:2
lá cờ cn

Bạn cần nối hai mảnh ghép ở đây:

https://www.postgresql.org/docs/9.5/app-initdb.html

initdb, hướng dẫn bạn cách chuyển thông tin mã hóa tới chức năng tạo cơ sở dữ liệu.

Hình ảnh Docker chính thức của postgres, cho biết bạn có thể chuyển các tùy chọn sang initdb:

https://hub.docker.com/_/postgres

Vì vậy, câu trả lời sẽ giống như:

cơ sở dữ liệu:
    hình ảnh: postgres: mới nhất
    khối lượng:
        - db:/var/lib/postgresql/data
    môi trường:
        POSTGRES_PASSWORD: kiểm tra
        POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'

Hoặc những lập luận tương tự. Tôi đã bỏ qua tùy chọn lang, vì đây không phải là tùy chọn "chuyển cờ này cho postgres" chính thức trên trang hướng dẫn (liên kết đầu tiên tôi đưa vào).

Các thử nghiệm của tôi không chạy cái này bằng cách sử dụng docker Compose, nó nằm trên dòng lệnh bằng tùy chọn -e. Tuy nhiên, đây là cùng một khái niệm; "môi trường" trong soạn thảo docker là -e trên dòng lệnh. Để hóm hỉnh:

https://docs.docker.com/engine/reference/commandline/run/

--env , -e Đặt biến môi trường

Kiểm tra số 1 chỉ với bộ env mật khẩu:

docker run -e POSTGRES_PASSWORD=test postgres:latest

Đây là đầu ra của lần chạy mặc định:

postgres@cbf23636dabc:~$ psql
psql (13.4 (Debian 13.4-1.pgdg100+1))
Nhập "trợ giúp" để được trợ giúp.

postgres=# \l
                                 Danh sách cơ sở dữ liệu
   Tên | Chủ sở hữu | Mã hóa | đối chiếu | loại | đặc quyền truy cập   
-----------+----------+----------+------------+--- ---------+-----------------------
 bài đăng | bài đăng | UTF8 | vi_US.utf8 | vi_US.utf8 | 
 mẫu0 | bài đăng | UTF8 | vi_US.utf8 | vi_US.utf8 | =c/postgres +
           | | | | | postgres=CTc/postgres
 mẫu1 | bài đăng | UTF8 | vi_US.utf8 | vi_US.utf8 | =c/postgres +
           | | | | | postgres=CTc/postgres

Thử nghiệm số 2, với các biến môi trường được đặt như trên trong docker được đề xuất chỉ soạn trên CLI:

docker run -e POSTGRES_PASSWORD=test -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --lc-collate=C --lc-ctype=C' postgres:latest

Và sau đó là đầu ra:

postgres@b6b80c876f3e:~$ psql 
psql (13.4 (Debian 13.4-1.pgdg100+1))
Nhập "trợ giúp" để được trợ giúp.

postgres=# \l
                             Danh sách cơ sở dữ liệu
   Tên | Chủ sở hữu | Mã hóa | đối chiếu | loại | đặc quyền truy cập   
-----------+----------+----------+---------+------ -+-----------------------
 bài đăng | bài đăng | UTF8 | C | C | 
 mẫu0 | bài đăng | UTF8 | C | C | =c/postgres +
           | | | | | postgres=CTc/postgres
 mẫu1 | bài đăng | UTF8 | C | C | =c/postgres +
           | | | | | postgres=CTc/postgres

Cũng lưu ý, phần trên trang hình ảnh Postgresql Docker chính thức, nơi nó mô tả các tập lệnh khởi tạo. Đây là một cái gì đó bạn có thể xem xét là tốt.

Philipp avatar
lá cờ in
Cảm ơn bạn. Đây là lần đầu tiên tôi làm việc với PostgreSQL. Tôi không biết chi tiết về cách thức hoạt động của việc tạo cơ sở dữ liệu.
lá cờ cn
Không vấn đề gì! Postgres là một con gấu, nhưng tôi chắc chắn khuyên bạn nên tìm một GUI để làm việc với nó nếu bạn có thể. Có một số tùy chọn, mặc dù sở thích cá nhân của tôi là pgAdmin. Mã nguồn mở.
Điểm:0
lá cờ cn
xji

Tôi đã thử cách tiếp cận ở trên và một vấn đề khác mà tôi gặp phải là cơ sở Debian mặc định đi kèm với hình ảnh Postgres Docker chính thức không được cài đặt bất kỳ ngôn ngữ nào khác.

# ngôn ngữ -a
C
C.UTF-8
vi_US.utf8
VỊ TRÍ

Để đặt ngôn ngữ khác, ví dụ: Trung Quốc, nó là cần thiết để chạy e.g. localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8.

Sau đó, thiết lập các biến môi trường hoạt động.

Vì nhu cầu này, có vẻ như hình ảnh Postgres mặc định không đáp ứng tất cả các nhu cầu và sẽ tốt hơn nếu bạn tạo một hình ảnh tùy chỉnh, như được ghi lại trong bài này.

TỪ postgres
RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG zh_CN.utf8

sau đó docker build -t your-custom-image-name .

Sau đó, bạn có thể sử dụng hình ảnh tùy chỉnh trong docker-compose.yml thay vì hình ảnh postgres chính thức mà không cần đặt thêm bất kỳ biến môi trường nào.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.