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?
sumber
collate "C"
setelahorder by
. Terserah Anda untuk menentukan apakah dan di mana aplikasi Anda membutuhkannya. Sebagian besar aplikasi di luar sana tidak terlalu peduli.COLLATE
specifier yang berbeda dari database.Mengacu pada jawaban yang diterima Daniel tentang penyortiran menggunakan collations, perlu diketahui bahwa jika Anda menjalankan PostgreSQL di Mac bahwa collation pilihan Anda mungkin tidak berfungsi seperti yang Anda harapkan karena pengaturan yang tidak memadai untuk beberapa collation pada level sistem operasi. Anda dapat membaca lebih lanjut tentang masalah ini di sini:
http://www.postgresql.org/message-id/[email protected]
Ini bukan masalah spesifik PostgreSQL, tetapi masalah dengan konfigurasi default Mac untuk pengaturan collation. Sistem saya saat ini menjalankan PostgreSQL 9.3 pada OS X El Capitan Versi 10.11 dan menderita masalah ini. Sistem saya mengembalikan hasil kueri yang sama terlepas dari apakah saya menggunakan susunan “fr_FR” atau “en_US”. Sebagai contoh:
Menggunakan collation “fr_FR”:
Menggunakan susunan “en_US”:
Pada sistem saya, pengaturan collation (pada level sistem operasi), sama untuk “fr_FR” dan “en_US” seperti yang ditunjukkan dalam shell dengan menjalankan diff:
Semoga informasi tambahan ini bermanfaat bagi siapa pun yang membaca ini yang menggunakan PostgreSQL di Mac yang menderita masalah ini.
sumber