Na tvém designu jsem nenašel chybu. Zkusil jsem.
Místa a řazení
Znovu jsem se k této otázce vrátil. Zvažte tento testovací případ na sqlfiddle
. Zdá se, že to funguje dobře. Dokonce jsem vytvořil národní prostředí ca_ES.utf8
na mém místním testovacím serveru (PostgreSQL 9.1.6 na Debian Squeeze) a přidal jsem národní prostředí do mého clusteru DB:
CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');
Dostávám stejné výsledky, jaké lze vidět na sqlfiddle výše.
Názvy řazení jsou identifikátory a je třeba je uvést do dvojitých uvozovek, aby se zachoval pravopis CamelCase jako "ca_ES"
. Možná došlo k záměně s jinými lokalitami ve vašem systému? Zkontrolujte dostupná kolace
:
SELECT * FROM pg_collation;
Pravidla řazení jsou obecně odvozena z míst systému . Přečtěte si o podrobnostech v příručce zde
. Pokud stále máte nesprávné výsledky, pokusil bych se aktualizovat váš systém a znovu vytvořit národní prostředí pro "ca_ES"
. V Debianu (a souvisejících distribucích Linuxu) to lze provést pomocí:
dpkg-reconfigure locales
NFC
Mám ještě jeden nápad:nenormalizované řetězce UNICODE .
Může to být váš 'Àudio'
je ve skutečnosti '̀ ' || 'Audio'
? To by byla tato postava:
SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);
Přečtěte si více o akutním přízvuku na wikipedii
.
Musíte SET standard_conforming_strings = TRUE
použít řetězce Unicode jako v prvním řádku.
Všimněte si, že některé prohlížeče nedokážou správně zobrazit nenormalizované znaky Unicode a mnoho písem nemá žádný správný glyf pro speciální znaky, takže zde nemusíte nic vidět nebo jsou nesmyslné. UNICODE ale tyto nesmysly umožňuje. Vyzkoušejte, co máte:
SELECT octet_length('̀A') -- returns 3 (!)
SELECT octet_length('À') -- returns 2
Pokud je to to, co vaše databáze nasmlouvala, musíte se toho zbavit nebo nést následky. Lék je normalizovat vaše řetězce na NFC . Perl má vynikající schopnosti UNICODE-foo, můžete použít jejich knihovny ve funkci plperlu, abyste to udělali v PostgreSQL. Udělal jsem to, abych se zachránil před šílenstvím.
Přečtěte si pokyny k instalaci v tomto skvělém článku o normalizaci UNICODE v PostgreSQL od Davida Wheelera .
Přečtěte si všechny krvavé podrobnosti o Formulářích pro normalizaci Unicode na unicode.org
.