Jadi, saya punya beberapa server Debian dengan PostgreSQL. Secara historis, server-server dan PostgreSQL dilokalkan dengan charset Latin 9 dan saat itu baik-baik saja. Sekarang kita harus menangani hal-hal seperti Polandia, Yunani atau Cina, jadi mengubahnya menjadi masalah yang berkembang.
Ketika saya mencoba membuat database UTF8, saya mendapat pesan:
GALAT: penyandian UTF8 tidak cocok dengan fr_FR lokal Detail: Pengaturan LC_CTYPE yang dipilih membutuhkan penyandian LATIN9.
Beberapa kali saya melakukan penelitian pada subjek dengan teman lama saya Google, dan yang saya temukan hanyalah beberapa prosedur yang terlalu rumit seperti memperbarui Debian LANG
, mengkompilasi ulang PostgreSQL dengan charset yang benar, mengedit semua LC_
variabel sistem dan solusi tidak jelas lainnya. Jadi untuk saat ini, kami mengesampingkan masalah ini.
Baru-baru ini, ia kembali lagi, orang-orang Yunani menginginkan barang dan Latin 9 tidak mau. Dan ketika saya melihat masalah ini lagi, seorang rekan mendatangi saya dan berkata, “Tidak, itu mudah, lihat.”
Dia tidak mengedit apa pun, tidak melakukan trik sulap, dia hanya membuat kueri SQL ini:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Dan itu bekerja dengan baik.
Saya sebenarnya tidak tahu LC_CTYPE='C'
dan saya terkejut bahwa menggunakan ini bukan pada solusi pertama di Google dan bahkan di Stack Overflow. Saya melihat sekeliling dan saya hanya menemukan disebutkan pada dokumentasi PostgreSQL.
Ketika LC_CTYPE adalah C atau POSIX, set karakter apa pun diperbolehkan, tetapi untuk pengaturan lain LC_CTYPE hanya ada satu set karakter yang akan bekerja dengan benar. Karena pengaturan LC_CTYPE dibekukan oleh initdb, fleksibilitas yang jelas untuk menggunakan pengkodean yang berbeda dalam database berbeda dari sebuah cluster lebih teoretis daripada nyata, kecuali ketika Anda memilih lokal C atau POSIX (sehingga menonaktifkan kesadaran lokal nyata).
Jadi itu membuat saya bertanya-tanya, ini terlalu mudah, terlalu sempurna, apa downside? Dan saya masih kesulitan menemukan jawaban. Jadi di sini saya datang memposting di sini:
tl; dr: Apa kerugian menggunakan LC_CTYPE='C'
lebih dari lokalisasi tertentu? Apakah buruk melakukannya? Apa yang harus saya hancurkan?