Score:1

Docker PostgreSQL เปลี่ยนการเข้ารหัสฐานข้อมูลเป็น UTF-8

ธง in

ฉันต้องการเรียกใช้ผ่าน docker-compose คอนเทนเนอร์ postgres ซึ่งมี COLLATE และ CTYPE 'C' และฐานข้อมูลเข้ารหัส 'UTF-8' แต่ดูเหมือนว่าจะเป็นไปไม่ได้

นี่คือส่วนหนึ่งของ docker-compose.yml:

ฐานข้อมูล:
    ภาพ: postgres: ล่าสุด
    ปริมาณ:
        - db:/var/lib/postgresql/data
    สิ่งแวดล้อม:
        POSTGRES_PASSWORD: ทดสอบ
        LC_COLLATE:ค
        LC_CTYPE: ค
        ภาษา: C.UTF-8

และนี่คือผลลัพธ์บันทึก:

คลัสเตอร์ฐานข้อมูลจะเริ่มต้นด้วยโลแคล
การกำหนดค่าการค้นหาข้อความเริ่มต้นจะถูกตั้งค่าเป็น "อังกฤษ"
  รวบรวม: C
  CTYPE: ซี
  ข้อความ: C.UTF-8
  การเงิน: C.UTF-8
  ตัวเลข: C.UTF-8
  เวลา: C.UTF-8
การเข้ารหัสฐานข้อมูลเริ่มต้นได้รับการตั้งค่าเป็น "SQL_ASCII"

ฉันต้องมีการเข้ารหัสฐานข้อมูลใน UTF-8 และ COLLATE และ CTYPE ใน 'C' และ ไม่ 'C.UTF-8' มิฉะนั้นแอปพลิเคชันที่พึ่งพาไม่สามารถเชื่อมต่อได้

ฉันไม่พบสิ่งใดในเอกสารใดๆ หรือที่อื่น

Score:2
ธง cn

คุณต้องต่อจิ๊กซอว์สองชิ้นที่นี่:

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

initdb สอนวิธีส่งผ่านข้อมูลการเข้ารหัสไปยังฟังก์ชันสร้างฐานข้อมูล

ภาพ Docker อย่างเป็นทางการของ postgres ระบุว่าคุณสามารถส่งตัวเลือกไปที่ initdb:

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

Ergo คำตอบจะเป็นดังนี้:

ฐานข้อมูล:
    ภาพ: postgres: ล่าสุด
    ปริมาณ:
        - db:/var/lib/postgresql/data
    สิ่งแวดล้อม:
        POSTGRES_PASSWORD: ทดสอบ
        POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'

หรือข้อโต้แย้งที่คล้ายกัน. ฉันละเว้นตัวเลือก lang เนื่องจากนี่ไม่ใช่ตัวเลือก "ส่งการตั้งค่าสถานะนี้ไปยัง postgres" อย่างเป็นทางการในหน้าคน (ลิงก์แรกที่ฉันรวมไว้)

การทดสอบของฉันไม่ได้รันสิ่งนี้โดยใช้การเขียนนักเทียบท่า แต่อยู่ในบรรทัดคำสั่งโดยใช้ตัวเลือก -e นี่เป็นแนวคิดเดียวกันทุกประการ "สภาพแวดล้อม" ในการเขียนนักเทียบท่าคือ -e ในบรรทัดคำสั่ง เพื่อปัญญา:

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

--env , -e ตั้งค่าตัวแปรสภาพแวดล้อม

ทดสอบ #1 ด้วยชุดรหัสผ่าน env เท่านั้น:

นักเทียบท่ารัน -e POSTGRES_PASSWORD=ทดสอบ postgres:latest

นี่คือผลลัพธ์ของการเรียกใช้เริ่มต้น:

postgres@cbf23636dabc:~$ psql
psql (13.4 (เดเบียน 13.4-1.pgdg100+1))
พิมพ์ "ความช่วยเหลือ" เพื่อขอความช่วยเหลือ

โพสเกรส=# \l
                                 รายชื่อฐานข้อมูล
   ชื่อ | เจ้าของ | การเข้ารหัส | เรียงหน้า | Cประเภท | สิทธิ์การเข้าถึง   
-----------+----------+--------+------------+--- ---------+------------------------
 โพสต์เกรส | โพสต์เกรส | UTF8 | en_US.utf8 | en_US.utf8 | 
 แม่แบบ0 | โพสต์เกรส | UTF8 | en_US.utf8 | en_US.utf8 | =c/โพสเกรส +
           | | | | | postgres=CTc/โพสต์เกรส
 แม่แบบ1 | โพสต์เกรส | UTF8 | en_US.utf8 | en_US.utf8 | =c/โพสเกรส +
           | | | | | postgres=CTc/โพสต์เกรส

ทดสอบ #2 โดยตั้งค่าตัวแปรสภาพแวดล้อมตามด้านบนในนักเทียบท่าที่แนะนำซึ่งเขียนบน CLI เท่านั้น:

นักเทียบท่าเรียกใช้ -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 (เดเบียน 13.4-1.pgdg100+1))
พิมพ์ "ความช่วยเหลือ" เพื่อขอความช่วยเหลือ

โพสเกรส=# \l
                             รายชื่อฐานข้อมูล
   ชื่อ | เจ้าของ | การเข้ารหัส | เรียงหน้า | Cประเภท | สิทธิ์การเข้าถึง   
-----------+----------+---------+---------+------ -+----------------------
 โพสต์เกรส | โพสต์เกรส | UTF8 | ค | ค | 
 แม่แบบ0 | โพสต์เกรส | UTF8 | ค | ค | =c/โพสเกรส +
           | | | | | postgres=CTc/โพสต์เกรส
 แม่แบบ1 | โพสต์เกรส | UTF8 | ค | ค | =c/โพสเกรส +
           | | | | | postgres=CTc/โพสต์เกรส

โปรดสังเกตส่วนในหน้าอิมเมจ Postgresql Docker อย่างเป็นทางการ ซึ่งจะอธิบายสคริปต์การเริ่มต้น นี่คือสิ่งที่คุณอาจพิจารณาเช่นกัน

Philipp avatar
in flag
ขอขอบคุณ. นี่เป็นครั้งแรกที่ฉันทำงานกับ PostgreSQL ฉันไม่ทราบว่าการสร้างฐานข้อมูลทำงานอย่างไรโดยละเอียด
cn flag
ไม่มีปัญหา! Postgres เป็นหมีเล็กน้อย แต่ฉันขอแนะนำให้หา GUI เพื่อใช้งานหากคุณทำได้ มีหลายตัวเลือก แม้ว่าสิ่งที่ฉันชอบที่สุดคือ pgAdmin โอเพ่นซอร์ส.
Score:0
ธง cn
xji

ฉันลองใช้แนวทางด้านบนแล้ว และอีกปัญหาหนึ่งที่ฉันพบคือฐาน Debian เริ่มต้นที่มาพร้อมกับอิมเมจ Postgres Docker อย่างเป็นทางการไม่ได้ติดตั้งภาษาอื่นเลย

# ภาษา -a
ค
C.UTF-8
en_US.utf8
POSIX

หากต้องการตั้งค่าภาษาอื่น เช่น ภาษาจีนจำเป็นต้องเรียกใช้เช่น localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8.

จากนั้นตั้งค่าตัวแปรสภาพแวดล้อมทำงาน

เนื่องจากความต้องการนี้ ดูเหมือนว่าอิมเมจเริ่มต้นของ Postgres จะไม่ตอบสนองความต้องการทั้งหมด และจะเป็นการดีกว่าหากสร้างอิมเมจแบบกำหนดเองตามที่บันทึกไว้ ในโพสต์นี้.

จาก 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

แล้ว นักเทียบท่า build -t your-custom-image-name

จากนั้นคุณสามารถใช้ภาพที่กำหนดเองใน นักเทียบท่า-compose.yml แทนรูปภาพอย่างเป็นทางการของ postgres โดยไม่จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมเพิ่มเติม

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา