Nie mogę znaleźć skazy w twoim projekcie. Próbowałem.
Lokalizacje i sortowanie
Powróciłem do tego pytania. Rozważ ten przypadek testowy dotyczący sqlfiddle
. Wydaje się, że działa dobrze. Utworzyłem nawet język ca_ES.utf8
w moim lokalnym serwerze testowym (PostgreSQL 9.1.6 na Debian Squeeze) i dodałem ustawienia regionalne do mojego klastra DB:
CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');
Otrzymuję te same wyniki, które można zobaczyć w powyższym sqlfiddle.
Pamiętaj, że nazwy sortowania są identyfikatorami i muszą być ujęte w cudzysłów, aby zachować pisownię CamelCase, taką jak "ca_ES"
. Może nastąpiło zamieszanie z innymi lokalizacjami w twoim systemie? Sprawdź swoje dostępne zestawienia
:
SELECT * FROM pg_collation;
Ogólnie reguły sortowania pochodzą z lokalizacji systemu . Przeczytaj szczegóły w instrukcji tutaj
. Jeśli nadal otrzymujesz nieprawidłowe wyniki, spróbuję zaktualizować Twój system i ponownie wygenerować ustawienia regionalne dla "ca_ES"
. W Debianie (i powiązanych dystrybucjach Linuksa) można to zrobić za pomocą:
dpkg-reconfigure locales
NFC
Mam jeszcze jeden pomysł:nieznormalizowane ciągi UNICODE .
Czy to możliwe, że Twoje 'Àudio'
jest w rzeczywistości '̀ ' || 'Audio'
? To byłaby ta postać:
SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);
Przeczytaj więcej o ostrym akcencie w Wikipedii
.
Musisz SET standard_conforming_strings = TRUE
używać ciągów Unicode, jak w pierwszym wierszu.
Zwróć uwagę, że niektóre przeglądarki nie mogą poprawnie wyświetlać nieznormalizowanych znaków Unicode, a wiele czcionek nie ma odpowiedniego glifu dla znaków specjalnych, więc możesz nic tu nie widzieć ani nie widzieć bełkotu. Ale UNICODE pozwala na ten nonsens. Przetestuj, aby zobaczyć, co masz:
SELECT octet_length('̀A') -- returns 3 (!)
SELECT octet_length('À') -- returns 2
Jeśli to właśnie zakontraktowała twoja baza danych, musisz się jej pozbyć lub ponieść konsekwencje. Lekarstwem jest znormalizowanie ciągów do NFC . Perl ma doskonałe umiejętności UNICODE-foo, możesz wykorzystać ich biblioteki w funkcji plperlu, aby zrobić to w PostgreSQL. Zrobiłem to, aby uratować mnie od szaleństwa.
Przeczytaj instrukcje instalacji w tym doskonałym artykule o normalizacji UNICODE w PostgreSQL autorstwa Davida Wheelera .
Przeczytaj wszystkie krwawe szczegóły dotyczące formularzy normalizacji Unicode na unicode.org
.