ดังนั้นฉันมีเซิร์ฟเวอร์ Debian ไม่กี่เครื่องที่มี PostgreSQL อยู่ ในอดีตเซิร์ฟเวอร์เหล่านั้นและ PostgreSQL มีการแปลเป็นภาษาละตินด้วยชุดอักขระ Latin 9 และย้อนกลับไปได้ ตอนนี้เราต้องจัดการกับสิ่งต่างๆเช่นโปแลนด์กรีกหรือจีนดังนั้นการเปลี่ยนมันจึงกลายเป็นปัญหาที่กำลังเติบโต
เมื่อฉันพยายามสร้างฐานข้อมูล UTF8 ฉันได้รับข้อความ:
ข้อผิดพลาด: การเข้ารหัส UTF8 ไม่ตรงกับรายละเอียดสถานที่ fr_FR: การตั้งค่า LC_CTYPE ที่เลือกต้องใช้การเข้ารหัส LATIN9
ไม่กี่ครั้งที่ฉันได้ทำการวิจัยเกี่ยวกับเรื่องนี้กับเพื่อนเก่าของ Google และสิ่งที่ฉันพบคือขั้นตอนที่ซับซ้อนเช่นการอัปเดต Debian LANG
, คอมไพล์ PostgreSQL ด้วยชุดอักขระที่ถูกต้องแก้ไขLC_
ตัวแปรระบบทั้งหมดและโซลูชันที่ไม่ชัดเจนอื่น ๆ ดังนั้นในขณะนี้เราจึงปล่อยให้ปัญหานี้เกิดขึ้น
เมื่อเร็ว ๆ นี้มันกลับมาอีกครั้งชาวกรีกต้องการสิ่งของและละติน 9 ไม่ต้องการ และในขณะที่ฉันกำลังตรวจสอบปัญหานี้อีกครั้งเพื่อนร่วมงานคนหนึ่งมาหาฉันและพูดว่า "ไม่นะมันง่ายดูสิ"
เขาไม่ได้ทำการแก้ไขอะไรเลยไม่ได้ใช้กลอุบายเขาแค่ทำแบบสอบถาม SQL นี้:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
และมันก็ใช้ได้ดี
ที่จริงฉันไม่รู้LC_CTYPE='C'
และฉันประหลาดใจที่การใช้สิ่งนี้ไม่ได้เป็นโซลูชันแรกใน Google และแม้แต่ใน Stack Overflow ฉันมองไปรอบ ๆ และพบเพียงการกล่าวถึงในเอกสาร PostgreSQL
เมื่อ LC_CTYPE เป็น C หรือ POSIX อนุญาตให้ใช้ชุดอักขระใด ๆ แต่สำหรับการตั้งค่าอื่นของ LC_CTYPE จะมีชุดอักขระเพียงชุดเดียวที่ทำงานได้อย่างถูกต้อง เนื่องจากการตั้งค่า LC_CTYPE ถูกแช่แข็งโดย initdb ความยืดหยุ่นที่ชัดเจนในการใช้การเข้ารหัสที่แตกต่างกันในฐานข้อมูลที่แตกต่างกันของคลัสเตอร์นั้นมีความเป็นทฤษฎีมากกว่าของจริงยกเว้นเมื่อคุณเลือกภาษา C หรือ POSIX (ปิดใช้งานการรับรู้สถานที่จริง)
มันทำให้ฉันสงสัยว่ามันง่ายเกินไปสมบูรณ์แบบเกินไปข้อเสียคืออะไร และฉันก็พบว่ายากที่จะหาคำตอบ ดังนั้นที่นี่ฉันมาโพสต์ที่นี่:
tl; dr: ข้อเสียของการใช้LC_CTYPE='C'
มากกว่าการแปลเฉพาะคืออะไร? การทำเช่นนั้นไม่ดีใช่ไหม สิ่งที่ฉันควรคาดหวังที่จะทำลาย?