Ik kan geen fout vinden in je ontwerp. Ik heb het geprobeerd.
Locales en sortering
Ik heb deze vraag opnieuw bekeken. Overweeg deze testcase over sqlfiddle
. Het lijkt gewoon goed te werken. Ik heb zelfs de landinstelling ca_ES.utf8
gemaakt in mijn lokale testserver (PostgreSQL 9.1.6 op Debian Squeeze) en de landinstelling toegevoegd aan mijn DB-cluster:
CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');
Ik krijg dezelfde resultaten als in de bovenstaande sqlfiddle.
Merk op dat sorteernamen identificaties zijn en dubbele aanhalingstekens nodig hebben om CamelCase-spelling zoals "ca_ES"
te behouden . Misschien is er wat verwarring geweest met andere locales in uw systeem? Controleer uw beschikbare sorteringen
:
SELECT * FROM pg_collation;
Over het algemeen zijn sorteerregels afgeleid van systeemlandinstellingen . Lees hier over de details in de handleiding
. Als u nog steeds onjuiste resultaten krijgt, zou ik proberen uw systeem bij te werken en de landinstelling voor "ca_ES"
opnieuw te genereren . In Debian (en gerelateerde Linux-distributies) kan dit met:
dpkg-reconfigure locales
NFC
Ik heb nog een ander idee:niet-genormaliseerde UNICODE-tekenreeksen .
Kan het zijn dat uw 'Àudio'
is in feite '̀ ' || 'Audio'
? Dat zou dit karakter zijn:
SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);
Lees meer over het acute accent in wikipedia
.
Je moet SET standard_conforming_strings = TRUE
om Unicode-strings te gebruiken zoals in de eerste regel.
Merk op dat sommige browsers niet-genormaliseerde Unicode-tekens niet correct kunnen weergeven en dat veel lettertypen geen juiste glyph hebben voor de speciale tekens, dus het kan zijn dat u hier niets of gebrabbel ziet. Maar UNICODE laat die onzin toe. Test om te zien wat je hebt:
SELECT octet_length('̀A') -- returns 3 (!)
SELECT octet_length('À') -- returns 2
Als dat is wat uw database heeft opgelopen, moet u zich ervan ontdoen of de gevolgen ondervinden. De remedie is om je strings te normaliseren naar NFC . Perl heeft superieure UNICODE-foo-vaardigheden, je kunt hun bibliotheken gebruiken in een plperlu-functie om het in PostgreSQL te doen. Ik heb dat gedaan om me te redden van waanzin.
Lees installatie-instructies in dit uitstekende artikel over UNICODE-normalisatie in PostgreSQL door David Wheeler .
Lees alle bloederige details over Unicode Normalization Forms op unicode.org
.