PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL 9.1 używający sortowania w wybranych instrukcjach

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zresetuj sekwencję w jpa

  2. sumowanie i generowanie serii nie działa w postgresql

  3. jak wykorzystać wartość kolumny jako dane wejściowe do operacji przestrzennej

  4. Jak sprawić, by rozszerzenie nie było relokowalne?

  5. Django/Python:Zaktualizuj relację do punktu w ustawieniach.AUTH_USER_MODEL