Saya tidak dapat menemukan cacat dalam desain Anda. Saya sudah mencoba.
Lokal dan susunan
Saya meninjau kembali pertanyaan ini. Pertimbangkan kasus uji di sqlfiddle ini
. Tampaknya bekerja dengan baik. Saya bahkan membuat ca_ES.utf8
lokal di server pengujian lokal saya (PostgreSQL 9.1.6 pada Debian Squeeze) dan menambahkan lokal ke cluster DB saya:
CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');
Saya mendapatkan hasil yang sama seperti yang dapat dilihat pada sqlfiddle di atas.
Perhatikan bahwa nama susunan adalah pengidentifikasi dan perlu dikutip ganda untuk mempertahankan ejaan CamelCase seperti "ca_ES"
. Mungkin ada beberapa kebingungan dengan lokal lain di sistem Anda? Periksa kolasi yang tersedia
:
SELECT * FROM pg_collation;
Umumnya, aturan susunan diturunkan dari lokal sistem . Baca tentang detail dalam manual di sini
. Jika Anda masih mendapatkan hasil yang salah, saya akan mencoba memperbarui sistem Anda dan membuat ulang lokal untuk "ca_ES"
. Di Debian (dan distribusi Linux terkait) ini dapat dilakukan dengan:
dpkg-reconfigure locales
NFC
Saya punya satu ide lain:string UNICODE yang tidak dinormalisasi .
Mungkinkah 'Àudio'
your Anda sebenarnya '̀ ' || 'Audio'
? Itu akan menjadi karakter ini:
SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);
Baca lebih lanjut tentang aksen akut di wikipedia
.
Anda harus SET standard_conforming_strings = TRUE
untuk menggunakan string Unicode seperti pada baris pertama.
Perhatikan bahwa beberapa browser tidak dapat menampilkan karakter Unicode yang tidak dinormalisasi dengan benar dan banyak font tidak memiliki mesin terbang yang tepat untuk karakter khusus, jadi Anda mungkin tidak melihat apa pun di sini atau omong kosong. Tapi UNICODE mengizinkan omong kosong itu. Uji untuk melihat apa yang Anda dapatkan:
SELECT octet_length('̀A') -- returns 3 (!)
SELECT octet_length('À') -- returns 2
Jika itu yang dikontrak oleh database Anda, Anda harus menyingkirkannya atau menanggung akibatnya. Obatnya adalah menormalkan string Anda menjadi NFC . Perl memiliki keterampilan UNICODE-foo yang unggul, Anda dapat menggunakan perpustakaan mereka dalam fungsi plperlu untuk melakukannya di PostgreSQL. Saya telah melakukan itu untuk menyelamatkan saya dari kegilaan.
Baca petunjuk penginstalan di artikel luar biasa ini tentang normalisasi UNICODE di PostgreSQL oleh David Wheeler .
Baca semua detail mengerikan tentang Formulir Normalisasi Unicode di unicode.org
.